From 9226b9b70871682a3a746e138bd5e4272f8d0897 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 11:48:09 +0100 Subject: [PATCH 01/15] TASK: Replace translation fallback closure pattern with parameter substitution in new `translate` function --- .../PublishingDialog/ConfirmationDialog.tsx | 50 ++++--------- .../PublishingDialog/ProcessIndicator.tsx | 50 ++++--------- .../Modals/PublishingDialog/ResultDialog.tsx | 70 ++++++------------- .../SyncWorkspaceDialog/ConflictList.tsx | 37 +++------- .../ResolutionStrategySelectionDialog.tsx | 13 ++-- .../SyncWorkspaceDialog/ResultDialog.tsx | 29 ++------ 6 files changed, 72 insertions(+), 177 deletions(-) diff --git a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx index 49e3e3e03b..4409e3da53 100644 --- a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import {PublishingMode, PublishingPhase, PublishingScope} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {Diagram} from './Diagram'; @@ -29,13 +29,11 @@ const ConfirmationDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.confirmation.title', - fallback: (props: { scopeTitle: string; }) => - `Publish all changes in workspace "${props.scopeTitle}"` + fallback: 'Publish all changes in workspace "{scopeTitle}"' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.confirmation.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; targetWorkspaceName: null | string; }) => - `Are you sure that you want to publish all ${props.numberOfChanges} change(s) in workspace "${props.scopeTitle}" to workspace "${props.targetWorkspaceName}"? Be careful: This cannot be undone!` + fallback: 'Are you sure that you want to publish all {numberOfChanges} change(s) in workspace "{scopeTitle}" to workspace "{targetWorkspaceName}"? Be careful: This cannot be undone!' }, cancel: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.confirmation.cancel', @@ -51,13 +49,11 @@ const ConfirmationDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.confirmation.title', - fallback: (props: { scopeTitle: string; }) => - `Publish all changes in site "${props.scopeTitle}"` + fallback: 'Publish all changes in site "{scopeTitle}"' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.confirmation.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; sourceWorkspaceName: string; targetWorkspaceName: null | string; }) => - `Are you sure that you want to publish all ${props.numberOfChanges} change(s) in site "${props.scopeTitle}" from workspace "${props.sourceWorkspaceName}" to workspace "${props.targetWorkspaceName}"? Be careful: This cannot be undone!` + fallback: 'Are you sure that you want to publish all {numberOfChanges} change(s) in site "{scopeTitle}" from workspace "{sourceWorkspaceName}" to workspace "{targetWorkspaceName}"? Be careful: This cannot be undone!' }, cancel: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.confirmation.cancel', @@ -74,13 +70,11 @@ const ConfirmationDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.confirmation.title', - fallback: (props: { scopeTitle: string; }) => - `Publish all changes in document "${props.scopeTitle}"` + fallback: 'Publish all changes in document "{scopeTitle}"' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.confirmation.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; sourceWorkspaceName: string; targetWorkspaceName: null | string; }) => - `Are you sure that you want to publish all ${props.numberOfChanges} change(s) in document "${props.scopeTitle}" from workspace "${props.sourceWorkspaceName}" to workspace "${props.targetWorkspaceName}"? Be careful: This cannot be undone!` + fallback: 'Are you sure that you want to publish all {numberOfChanges} change(s) in document "{scopeTitle}" from workspace "{sourceWorkspaceName}" to workspace "{targetWorkspaceName}"? Be careful: This cannot be undone!' }, cancel: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.confirmation.cancel', @@ -104,13 +98,11 @@ const ConfirmationDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.confirmation.title', - fallback: (props: { scopeTitle: string; }) => - `Discard all changes in workspace "${props.scopeTitle}"` + fallback: 'Discard all changes in workspace "{scopeTitle}"' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.confirmation.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; }) => - `Are you sure that you want to discard all ${props.numberOfChanges} change(s) in workspace "${props.scopeTitle}"? Be careful: This cannot be undone!` + fallback: 'Are you sure that you want to discard all {numberOfChanges} change(s) in workspace "{scopeTitle}"? Be careful: This cannot be undone!' }, cancel: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.confirmation.cancel', @@ -126,13 +118,11 @@ const ConfirmationDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.confirmation.title', - fallback: (props: { scopeTitle: string; }) => - `Discard all changes in site "${props.scopeTitle}"` + fallback: 'Discard all changes in site "{scopeTitle}"' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.confirmation.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; sourceWorkspaceName: string; }) => - `Are you sure that you want to discard all ${props.numberOfChanges} change(s) in site "${props.scopeTitle}" from workspace "${props.sourceWorkspaceName}"? Be careful: This cannot be undone!` + fallback: 'Are you sure that you want to discard all {numberOfChanges} change(s) in site "{scopeTitle}" from workspace "{sourceWorkspaceName}"? Be careful: This cannot be undone!' }, cancel: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.confirmation.cancel', @@ -148,13 +138,11 @@ const ConfirmationDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.confirmation.title', - fallback: (props: { scopeTitle: string; }) => - `Discard all changes in document "${props.scopeTitle}"` + fallback: 'Discard all changes in document "{scopeTitle}"' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.confirmation.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; sourceWorkspaceName: string; }) => - `Are you sure that you want to discard all ${props.numberOfChanges} change(s) in document "${props.scopeTitle}" from workspace "${props.sourceWorkspaceName}"? Be careful: This cannot be undone!` + fallback: 'Are you sure that you want to discard all {numberOfChanges} change(s) in document "{scopeTitle}" from workspace "{sourceWorkspaceName}"? Be careful: This cannot be undone!' }, cancel: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.confirmation.cancel', @@ -209,11 +197,7 @@ export const ConfirmationDialog: React.FC = (props) => title={
- + {translate(variant[props.scope].label.title.id, variant[props.scope].label.title.fallback, props as any)}
} onRequestClose={props.onAbort} @@ -230,11 +214,7 @@ export const ConfirmationDialog: React.FC = (props) => targetWorkspaceName={props.targetWorkspaceName} numberOfChanges={props.numberOfChanges} /> - + {translate(variant[props.scope].label.message.id, variant[props.scope].label.message.fallback, props as any)} ); diff --git a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ProcessIndicator.tsx b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ProcessIndicator.tsx index 49a0a2286a..1af5092ddb 100644 --- a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ProcessIndicator.tsx +++ b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ProcessIndicator.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {Dialog, Icon} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {PublishingMode, PublishingPhase, PublishingScope} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {Diagram} from './Diagram'; @@ -23,13 +23,11 @@ const ProcessIndicatorVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.process.title', - fallback: (props: { scopeTitle: string; }) => - `Publishing all changes in workspace "${props.scopeTitle}"...` + fallback: 'Publishing all changes in workspace "{scopeTitle}"...' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.process.message', - fallback: (props: { numberOfChanges: number; }) => - `Please wait while ${props.numberOfChanges} change(s) are being published. This may take a while.` + fallback: 'Please wait while {numberOfChanges} change(s) are being published. This may take a while.' } } }, @@ -37,13 +35,11 @@ const ProcessIndicatorVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.process.title', - fallback: (props: { scopeTitle: string; }) => - `Publishing all changes in site "${props.scopeTitle}"...` + fallback: 'Publishing all changes in site "{scopeTitle}"...' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.process.message', - fallback: (props: { numberOfChanges: number; }) => - `Please wait while ${props.numberOfChanges} change(s) are being published. This may take a while.` + fallback: 'Please wait while {numberOfChanges} change(s) are being published. This may take a while.' } } }, @@ -51,13 +47,11 @@ const ProcessIndicatorVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.process.title', - fallback: (props: { scopeTitle: string; }) => - `Publishing all changes in document "${props.scopeTitle}"...` + fallback: 'Publishing all changes in document "{scopeTitle}"...' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.process.message', - fallback: (props: { numberOfChanges: number; }) => - `Please wait while ${props.numberOfChanges} change(s) are being published. This may take a while.` + fallback: 'Please wait while {numberOfChanges} change(s) are being published. This may take a while.' } } } @@ -68,13 +62,11 @@ const ProcessIndicatorVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.process.title', - fallback: (props: { scopeTitle: string; }) => - `Discarding all changes in workspace "${props.scopeTitle}"...` + fallback: 'Discarding all changes in workspace "{scopeTitle}"...' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.process.message', - fallback: (props: { numberOfChanges: number; }) => - `Please wait while ${props.numberOfChanges} change(s) are being discarded. This may take a while.` + fallback: 'Please wait while {numberOfChanges} change(s) are being discarded. This may take a while.' } } }, @@ -82,13 +74,11 @@ const ProcessIndicatorVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.process.title', - fallback: (props: { scopeTitle: string; }) => - `Discarding all changes in site "${props.scopeTitle}"...` + fallback: 'Discarding all changes in site "{scopeTitle}"...' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.process.message', - fallback: (props: { numberOfChanges: number; }) => - `Please wait while ${props.numberOfChanges} change(s) are being discarded. This may take a while.` + fallback: 'Please wait while {numberOfChanges} change(s) are being discarded. This may take a while.' } } }, @@ -96,13 +86,11 @@ const ProcessIndicatorVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.process.title', - fallback: (props: { scopeTitle: string; }) => - `Discarding all changes in document "${props.scopeTitle}"...` + fallback: 'Discarding all changes in document "{scopeTitle}"...' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.process.message', - fallback: (props: { numberOfChanges: number; }) => - `Please wait while ${props.numberOfChanges} change(s) are being discarded. This may take a while.` + fallback: 'Please wait while {numberOfChanges} change(s) are being discarded. This may take a while.' } } } @@ -126,11 +114,7 @@ export const ProcessIndicator: React.FC<{
- + {translate(variant[props.scope].label.title.id, variant[props.scope].label.title.fallback, props as any)}
} @@ -148,11 +132,7 @@ export const ProcessIndicator: React.FC<{ targetWorkspaceName={props.targetWorkspaceName} numberOfChanges={props.numberOfChanges} /> - + {translate(variant[props.scope].label.message.id, variant[props.scope].label.message.fallback, props as any)} ); diff --git a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ResultDialog.tsx b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ResultDialog.tsx index 60bdf9550a..608e3ec267 100644 --- a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ResultDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ResultDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import {PublishingMode, PublishingPhase, PublishingScope} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {AnyError, ErrorView} from '@neos-project/neos-ui-error'; @@ -28,13 +28,11 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.success.title', - fallback: (props: { scopeTitle: string; }) => - `All changes in workspace "${props.scopeTitle}" were published` + fallback: 'All changes in workspace "{scopeTitle}" were published' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.success.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; targetWorkspaceName: null | string; }) => - `All ${props.numberOfChanges} change(s) in workspace "${props.scopeTitle}" were sucessfully published to workspace "${props.targetWorkspaceName}".` + fallback: 'All {numberOfChanges} change(s) in workspace "{scopeTitle}" were sucessfully published to workspace "{targetWorkspaceName}".' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.success.acknowledge', @@ -46,13 +44,11 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.success.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in site "${props.scopeTitle}" were published` + fallback: 'Changes in site "{scopeTitle}" were published' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.success.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; targetWorkspaceName: null | string; }) => - `${props.numberOfChanges} change(s) in site "${props.scopeTitle}" were sucessfully published to workspace "${props.targetWorkspaceName}".` + fallback: '{numberOfChanges} change(s) in site "{scopeTitle}" were sucessfully published to workspace "{targetWorkspaceName}".' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.success.acknowledge', @@ -65,13 +61,11 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.success.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in document "${props.scopeTitle}" were published` + fallback: 'Changes in document "{scopeTitle}" were published' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.success.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; targetWorkspaceName: null | string; }) => - `${props.numberOfChanges} change(s) in document "${props.scopeTitle}" were sucessfully published to workspace "${props.targetWorkspaceName}".` + fallback: '{numberOfChanges} change(s) in document "{scopeTitle}" were sucessfully published to workspace "{targetWorkspaceName}".' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.success.acknowledge', @@ -87,8 +81,7 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.error.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in workspace "${props.scopeTitle}" could not be published` + fallback: 'Changes in workspace "{scopeTitle}" could not be published' }, retry: { id: 'Neos.Neos.Ui:PublishingDialog:publish.all.error.retry', @@ -104,8 +97,7 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.error.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in site "${props.scopeTitle}" could not be published` + fallback: 'Changes in site "{scopeTitle}" could not be published' }, retry: { id: 'Neos.Neos.Ui:PublishingDialog:publish.site.error.retry', @@ -121,8 +113,7 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.error.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in document "${props.scopeTitle}" could not be published` + fallback: 'Changes in document "{scopeTitle}" could not be published' }, retry: { id: 'Neos.Neos.Ui:PublishingDialog:publish.document.error.retry', @@ -145,13 +136,11 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.success.title', - fallback: (props: { scopeTitle: string; }) => - `All changes in workspace "${props.scopeTitle}" were discarded` + fallback: 'All changes in workspace "{scopeTitle}" were discarded' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.success.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; }) => - `All ${props.numberOfChanges} change(s) in workspace "${props.scopeTitle}" were sucessfully discarded.` + fallback: 'All {numberOfChanges} change(s) in workspace "{scopeTitle}" were sucessfully discarded.' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.success.acknowledge', @@ -163,13 +152,11 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.success.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in site "${props.scopeTitle}" were discarded` + fallback: 'Changes in site "{scopeTitle}" were discarded' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.success.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; }) => - `${props.numberOfChanges} change(s) in site "${props.scopeTitle}" were sucessfully discarded.` + fallback: '{numberOfChanges} change(s) in site "{scopeTitle}" were sucessfully discarded.' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.success.acknowledge', @@ -181,13 +168,11 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.success.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in document "${props.scopeTitle}" were discarded` + fallback: 'Changes in document "{scopeTitle}" were discarded' }, message: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.success.message', - fallback: (props: { numberOfChanges: number; scopeTitle: string; }) => - `${props.numberOfChanges} change(s) in document "${props.scopeTitle}" were sucessfully discarded.` + fallback: '{numberOfChanges} change(s) in document "{scopeTitle}" were sucessfully discarded.' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.success.acknowledge', @@ -203,8 +188,7 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.error.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in workspace "${props.scopeTitle}" could not be discarded` + fallback: 'Changes in workspace "{scopeTitle}" could not be discarded' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:discard.all.error.acknowledge', @@ -220,8 +204,7 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.error.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in site "${props.scopeTitle}" could not be discarded` + fallback: 'Changes in site "{scopeTitle}" could not be discarded' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:discard.site.error.acknowledge', @@ -237,8 +220,7 @@ const ResultDialogVariants = { label: { title: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.error.title', - fallback: (props: { scopeTitle: string; }) => - `Changes in document "${props.scopeTitle}" could not be discarded` + fallback: 'Changes in document "{scopeTitle}" could not be discarded' }, acknowledge: { id: 'Neos.Neos.Ui:PublishingDialog:discard.document.error.acknowledge', @@ -312,11 +294,7 @@ export const ResultDialog: React.FC<{
- + {translate(variant[props.result.phase][props.scope].label.title.id, variant[props.result.phase][props.scope].label.title.fallback, props as any)}
} @@ -337,13 +315,7 @@ export const ResultDialog: React.FC<{ /> {props.result.phase === PublishingPhase.ERROR ? () - : ( - - ) + : translate(variant[props.result.phase][props.scope].label.message.id, variant[props.result.phase][props.scope].label.message.fallback, props as any) } diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx index e473d7c685..357c9d989c 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx @@ -9,7 +9,7 @@ */ import React from 'react'; -import I18n, {I18nRegistry} from '@neos-project/neos-ui-i18n'; +import I18n, {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; import {Icon} from '@neos-project/react-ui-components'; import {Conflict, ReasonForConflict} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; import {TypeOfChange} from '@neos-project/neos-ui-redux-store/src/CR/Workspaces'; @@ -38,32 +38,28 @@ const VARIANTS_BY_TYPE_OF_CHANGE = { icon: 'pencil', label: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.typeOfChange.NODE_HAS_BEEN_CHANGED.label', - fallback: (props: { label: string }) => - `"${props.label}" has been edited.` + fallback: '"{label}" has been edited.' } }, [TypeOfChange.NODE_HAS_BEEN_CREATED]: { icon: 'plus', label: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.typeOfChange.NODE_HAS_BEEN_CREATED.label', - fallback: (props: { label: string }) => - `"${props.label}" has been created.` + fallback: '"{label}" has been created.' } }, [TypeOfChange.NODE_HAS_BEEN_DELETED]: { icon: 'times', label: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.typeOfChange.NODE_HAS_BEEN_DELETED.label', - fallback: (props: { label: string }) => - `"${props.label}" has been deleted.` + fallback: '"{label}" has been deleted.' } }, [TypeOfChange.NODE_HAS_BEEN_MOVED]: { icon: 'long-arrow-right', label: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.typeOfChange.NODE_HAS_BEEN_MOVED.label', - fallback: (props: { label: string }) => - `"${props.label}" has been moved.` + fallback: '"{label}" has been moved.' } } } as const; @@ -73,8 +69,7 @@ const VARIANTS_BY_REASON_FOR_CONFLICT = { icon: 'times', label: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.reasonForConflict.NODE_HAS_BEEN_DELETED.label', - fallback: (props: { label: string }) => - `"${props.label}" or one of its ancestor nodes has been deleted.` + fallback: '"{label}" or one of its ancestor nodes has been deleted.' } } } as const; @@ -159,15 +154,7 @@ const ConflictItem: React.FC<{ className={style.conflict__changeIcon} icon={changeVariant.icon} /> - + {translate(changeVariant.label.id, changeVariant.label.fallback, {label: affectedNode.label})} ) : (
@@ -189,15 +176,7 @@ const ConflictItem: React.FC<{ {reasonVariant ? (
- + {translate(reasonVariant.label.id, reasonVariant.label.fallback, {label: affectedNode.label})}
) : (
diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx index 6c46c83095..e597357d6f 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx @@ -9,7 +9,7 @@ */ import React from 'react'; -import I18n, {I18nRegistry} from '@neos-project/neos-ui-i18n'; +import I18n, {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; import {Button, Dialog, Icon, SelectBox, SelectBox_Option_MultiLineWithThumbnail} from '@neos-project/react-ui-components'; import {Conflict, ResolutionStrategy, SyncingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; @@ -26,7 +26,7 @@ const VARIANTS_BY_RESOLUTION_STRATEGY = { labels: { label: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.option.FORCE.label', - fallback: () => 'Drop conflicting changes' + fallback: 'Drop conflicting changes' }, description: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.option.FORCE.description', @@ -39,8 +39,7 @@ const VARIANTS_BY_RESOLUTION_STRATEGY = { labels: { label: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.option.DISCARD_ALL.label', - fallback: (props: {workspaceName: WorkspaceName}) => - `Discard workspace "${props.workspaceName}"` + fallback: 'Discard workspace "{workspaceName}"' }, description: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.option.DISCARD_ALL.description', @@ -83,12 +82,12 @@ export const ResolutionStrategySelectionDialog: React.FC<{ return { value: String(value), icon: variant.icon, - label: props.i18n.translate( + label: translate( variant.labels.label.id, - variant.labels.label.fallback(params), + variant.labels.label.fallback, params ), - description: props.i18n.translate( + description: translate( variant.labels.description.id, variant.labels.description.fallback ) diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResultDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResultDialog.tsx index 3d1c8eae81..3bc823e1d4 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResultDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResultDialog.tsx @@ -9,7 +9,7 @@ */ import React from 'react'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; import {AnyError, ErrorView} from '@neos-project/neos-ui-error'; @@ -17,7 +17,6 @@ import {Diagram} from './Diagram'; import style from './style.module.css'; import {SyncingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; -import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; const VARIANTS_BY_SYNCING_PHASE = { [SyncingPhase.SUCCESS]: { @@ -26,13 +25,11 @@ const VARIANTS_BY_SYNCING_PHASE = { label: { title: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:success.title', - fallback: (props: { workspaceName: WorkspaceName; }) => - `Workspace "${props.workspaceName}" is up-to-date` + fallback: 'Workspace "{workspaceName}" is up-to-date' }, message: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:success.message', - fallback: (props: { workspaceName: WorkspaceName; baseWorkspaceName: WorkspaceName; }) => - `Workspace "${props.workspaceName}" has been successfully synchronized with all recent changes in workspace "${props.baseWorkspaceName}".` + fallback: 'Workspace "{workspaceName}" has been successfully synchronized with all recent changes in workspace "{baseWorkspaceName}".' } } }, @@ -42,13 +39,11 @@ const VARIANTS_BY_SYNCING_PHASE = { label: { title: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:error.title', - fallback: (props: { workspaceName: WorkspaceName; }) => - `Workspace "${props.workspaceName}" could not be synchronized` + fallback: 'Workspace "{workspaceName}" could not be synchronized' }, message: { id: 'Neos.Neos.Ui:SyncWorkspaceDialog:error.message', - fallback: (props: { workspaceName: WorkspaceName; baseWorkspaceName: WorkspaceName; }) => - `Workspace "${props.workspaceName}" could not be synchronized with the recent changes in workspace "${props.baseWorkspaceName}".` + fallback: 'Workspace "{workspaceName}" could not be synchronized with the recent changes in workspace "{baseWorkspaceName}".' } } } @@ -119,11 +114,7 @@ export const ResultDialog: React.FC<{ title={
- + {translate(variant.label.title.id, variant.label.title.fallback, props as any)}
} onRequestClose={props.onAcknowledge} @@ -142,13 +133,7 @@ export const ResultDialog: React.FC<{ /> {props.result.phase === SyncingPhase.ERROR ? () - : ( - - ) + : translate(variant.label.message.id, variant.label.message.fallback, props as any) } From 89f6d4ce6f7e968ff71ab28ccda04e43bebf5e10 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 11:57:39 +0100 Subject: [PATCH 02/15] TASK: Replace simple uses of in new publishing code --- .../PublishingDialog/ConfirmationDialog.tsx | 6 +-- .../Modals/PublishingDialog/ResultDialog.tsx | 8 ++-- .../ConfirmationDialog.tsx | 12 ++---- .../SyncWorkspaceDialog/ConflictList.tsx | 39 ++++--------------- .../ResolutionStrategyConfirmationDialog.tsx | 32 ++++----------- .../ResolutionStrategySelectionDialog.tsx | 15 ++----- .../SyncWorkspaceDialog/ResultDialog.tsx | 17 ++------ 7 files changed, 32 insertions(+), 97 deletions(-) diff --git a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx index 4409e3da53..df19425145 100644 --- a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; -import I18n, {translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {PublishingMode, PublishingPhase, PublishingScope} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {Diagram} from './Diagram'; @@ -181,7 +181,7 @@ export const ConfirmationDialog: React.FC = (props) => hoverStyle="brand" onClick={props.onAbort} > - + {translate(variant[props.scope].label.cancel.id, variant[props.scope].label.cancel.fallback)} , ]} title={
diff --git a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ResultDialog.tsx b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ResultDialog.tsx index 608e3ec267..1e94016c1d 100644 --- a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ResultDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ResultDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; -import I18n, {translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {PublishingMode, PublishingPhase, PublishingScope} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {AnyError, ErrorView} from '@neos-project/neos-ui-error'; @@ -266,7 +266,7 @@ export const ResultDialog: React.FC<{ hoverStyle="brand" onClick={props.onAcknowledge} > - + {translate(variant[props.result.phase][props.scope].label.acknowledge.id, variant[props.result.phase][props.scope].label.acknowledge.fallback)} , ] : [ ]} title={ diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx index 36ec8a8f8d..b3c5a8febc 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; import {SyncingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; @@ -35,10 +35,7 @@ export const ConfirmationDialog: React.FC<{ hoverStyle="brand" onClick={props.onCancel} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:confirmation.cancel', 'No, cancel')} , ]} title={ diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx index 357c9d989c..bc7b0c1dbb 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx @@ -9,7 +9,7 @@ */ import React from 'react'; -import I18n, {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; +import {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; import {Icon} from '@neos-project/react-ui-components'; import {Conflict, ReasonForConflict} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; import {TypeOfChange} from '@neos-project/neos-ui-redux-store/src/CR/Workspaces'; @@ -121,10 +121,7 @@ const ConflictItem: React.FC<{
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.affectedSite.label', 'Affected Site')}
@@ -132,10 +129,7 @@ const ConflictItem: React.FC<{
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.affectedDocument.label', 'Affected Document')}
@@ -143,10 +137,7 @@ const ConflictItem: React.FC<{
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.typeOfChange.label', 'What was changed?')}
{changeVariant ? (
@@ -158,20 +149,14 @@ const ConflictItem: React.FC<{
) : (
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.typeOfChange.unknownMessage', 'Sorry, but there is no available information on this change.')}
)}
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.reasonForConflict.label', 'Why is there a conflict?')}
{reasonVariant ? (
@@ -180,10 +165,7 @@ const ConflictItem: React.FC<{
) : (
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.reasonForConflict.unknownMessage', 'Sorry, but there is no available information on the reason for this conflict.')}
)}
@@ -209,11 +191,6 @@ const Node: React.FC<{ icon={VARIANTS_BY_TYPE_OF_CHANGE[props.typeOfChange].icon} /> ) : null} - {props.label ?? ( - - )} + {props.label ?? translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.unknownNode', 'Unknown Node')} ); diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx index 43923d4b52..59d588147f 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; -import I18n, {I18nRegistry} from '@neos-project/neos-ui-i18n'; +import I18n, {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; import {PublishingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {Conflict, ResolutionStrategy} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; @@ -58,10 +58,7 @@ const ForceConfirmationDialog: React.FC<{ hoverStyle="brand" onClick={props.onCancelConflictResolution} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.FORCE.confirmation.cancel', 'No, cancel')} , ]} title={ @@ -96,18 +90,12 @@ const ForceConfirmationDialog: React.FC<{ style={undefined as any} >
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.FORCE.confirmation.conflicts.label', 'You are about to drop the following changes:')} - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.FORCE.confirmation.message', 'Do you wish to proceed? Be careful: This cannot be undone!')}
); @@ -129,10 +117,7 @@ const DiscardAllConfirmationDialog: React.FC<{ hoverStyle="brand" onClick={props.onCancelConflictResolution} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.DISCARD_ALL.confirmation.cancel', 'No, cancel')} , ]} title={ diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx index e597357d6f..bd8518b3cd 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx @@ -111,10 +111,7 @@ export const ResolutionStrategySelectionDialog: React.FC<{ hoverStyle="brand" onClick={props.onCancel} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.cancel', 'Cancel Synchronization')} , ]} @@ -172,10 +166,7 @@ export const ResolutionStrategySelectionDialog: React.FC<{ i18n={props.i18n} /> - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.prompt', 'In order to proceed, you need to decide what to do with the conflicting changes:')} - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:error.acknowledge', 'Cancel')} , ] : [ ]} title={ From 457793d97f57d1bb7265de8a100940b5aa3c8fc0 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 12:16:24 +0100 Subject: [PATCH 03/15] TASK: Replace complex uses of in new publishing code --- .../ConfirmationDialog.tsx | 14 +++---------- .../SyncWorkspaceDialog/ProcessIndicator.tsx | 14 +++---------- .../ResolutionStrategyConfirmationDialog.tsx | 20 ++++--------------- .../ResolutionStrategySelectionDialog.tsx | 20 ++++--------------- 4 files changed, 14 insertions(+), 54 deletions(-) diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx index b3c5a8febc..b79363138e 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; -import I18n, {translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; import {SyncingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; @@ -52,11 +52,7 @@ export const ConfirmationDialog: React.FC<{ title={
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:confirmation.title', 'Synchronize workspace "{workspaceName}" with "{baseWorkspaceName}"', props as any)}
} onRequestClose={props.onCancel} @@ -72,11 +68,7 @@ export const ConfirmationDialog: React.FC<{ baseWorkspaceName={props.baseWorkspaceName} phase={SyncingPhase.START} /> - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:confirmation.message', 'Workspace "{baseWorkspaceName}" has been modified. You need to synchronize your workspace "{workspaceName}" with it in order to see those changes and avoid conflicts. Do you wish to proceed?', props as any)}
); diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ProcessIndicator.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ProcessIndicator.tsx index ee0323a1b7..ca7e22e118 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ProcessIndicator.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ProcessIndicator.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {Dialog, Icon} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {SyncingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; import {Diagram} from './Diagram'; @@ -26,11 +26,7 @@ export const ProcessIndicator: React.FC<{ title={
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:process.title', 'Synchronizing workspace "{workspaceName}"...', props as any)}
} type={undefined as any} @@ -46,11 +42,7 @@ export const ProcessIndicator: React.FC<{ workspaceName={props.workspaceName} baseWorkspaceName={props.baseWorkspaceName} /> - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:process.message', 'Please wait, while workspace "{workspaceName}" is being synchronized with recent changes in workspace "{baseWorkspaceName}". This may take a while.', props as any)} ); diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx index 59d588147f..33bf26ca53 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; -import I18n, {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; +import {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; import {PublishingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {Conflict, ResolutionStrategy} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; @@ -75,11 +75,7 @@ const ForceConfirmationDialog: React.FC<{ title={
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.FORCE.confirmation.title', 'Drop conflicting changes in workspace "{workspaceName}"', props as any)}
} onRequestClose={props.onCancelConflictResolution} @@ -134,11 +130,7 @@ const DiscardAllConfirmationDialog: React.FC<{ title={
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.DISCARD_ALL.confirmation.title', 'Discard all changes in workspace "{workspaceName}"', props as any)}
} onRequestClose={props.onCancelConflictResolution} @@ -155,11 +147,7 @@ const DiscardAllConfirmationDialog: React.FC<{ targetWorkspaceName={null} phase={PublishingPhase.START} /> - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.DISCARD_ALL.confirmation.message', 'You are about to discard all {numberOfChanges} change(s) in workspace "{workspaceName}". This includes all changes on other sites. Do you wish to proceed? Be careful: This cannot be undone!', {numberOfChanges: props.totalNumberOfChangesInWorkspace, workspaceName: props.workspaceName})} ); diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx index bd8518b3cd..9eaca5d2b9 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx @@ -9,7 +9,7 @@ */ import React from 'react'; -import I18n, {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; +import {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; import {Button, Dialog, Icon, SelectBox, SelectBox_Option_MultiLineWithThumbnail} from '@neos-project/react-ui-components'; import {Conflict, ResolutionStrategy, SyncingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; @@ -128,11 +128,7 @@ export const ResolutionStrategySelectionDialog: React.FC<{ title={
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.title', 'Conflicts between workspace "{workspaceName}" and "{baseWorkspaceName}"', props as any)}
} onRequestClose={props.onCancel} @@ -148,18 +144,10 @@ export const ResolutionStrategySelectionDialog: React.FC<{ baseWorkspaceName={props.baseWorkspaceName} phase={SyncingPhase.CONFLICT} /> - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.message', 'Workspace "{baseWorkspaceName}" contains modifications that are in conflict with the changes in workspace "{workspaceName}".', props as any)}
- + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.summary', 'Show information about {numberOfConflicts} conflict(s)', {numberOfConflicts: props.conflicts.length})} Date: Sun, 26 Jan 2025 12:28:05 +0100 Subject: [PATCH 04/15] TASK: Dont pass I18nRegistry around in new publishing code --- .../SyncWorkspaceDialog/ConflictList.tsx | 20 ++++--------------- .../ResolutionStrategyConfirmationDialog.tsx | 5 +---- .../ResolutionStrategySelectionDialog.tsx | 6 ++---- .../SyncWorkspaceDialog.tsx | 15 +------------- 4 files changed, 8 insertions(+), 38 deletions(-) diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx index bc7b0c1dbb..86a2efd614 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx @@ -9,7 +9,7 @@ */ import React from 'react'; -import {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {Icon} from '@neos-project/react-ui-components'; import {Conflict, ReasonForConflict} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; import {TypeOfChange} from '@neos-project/neos-ui-redux-store/src/CR/Workspaces'; @@ -18,7 +18,6 @@ import style from './style.module.css'; export const ConflictList: React.FC<{ conflicts: Conflict[]; - i18n: I18nRegistry; }> = (props) => { return (
    @@ -26,7 +25,6 @@ export const ConflictList: React.FC<{ ))}
@@ -76,7 +74,6 @@ const VARIANTS_BY_REASON_FOR_CONFLICT = { const ConflictItem: React.FC<{ conflict: Conflict; - i18n: I18nRegistry; }> = (props) => { const changeVariant = props.conflict.typeOfChange === null ? null @@ -86,24 +83,15 @@ const ConflictItem: React.FC<{ : VARIANTS_BY_REASON_FOR_CONFLICT[props.conflict.reasonForConflict]; const affectedNode = props.conflict.affectedNode ?? { icon: 'question', - label: props.i18n.translate( - 'Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.unknownNode', - 'Unknown Node' - ) + label: translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.unknownNode', 'Unknown Node') }; const affectedDocument = props.conflict.affectedDocument ?? { icon: 'question', - label: props.i18n.translate( - 'Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.unknownDocument', - 'Unknown Document' - ) + label: translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.unknownDocument', 'Unknown Document') }; const affectedSite = props.conflict.affectedSite ?? { icon: 'question', - label: props.i18n.translate( - 'Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.unknownSite', - 'Unknown Site' - ) + label: translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.unknownSite', 'Unknown Site') }; return ( diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx index 33bf26ca53..bd618637ef 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategyConfirmationDialog.tsx @@ -10,7 +10,7 @@ import React from 'react'; import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; -import {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; import {PublishingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {Conflict, ResolutionStrategy} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; @@ -27,7 +27,6 @@ export const ResolutionStrategyConfirmationDialog: React.FC<{ baseWorkspaceName: WorkspaceName; strategy: ResolutionStrategy; conflicts: Conflict[]; - i18n: I18nRegistry; onCancelConflictResolution: () => void; onConfirmResolutionStrategy: () => void; }> = (props) => { @@ -44,7 +43,6 @@ const ForceConfirmationDialog: React.FC<{ workspaceName: WorkspaceName; baseWorkspaceName: WorkspaceName; conflicts: Conflict[]; - i18n: I18nRegistry; onCancelConflictResolution: () => void; onConfirmResolutionStrategy: () => void; }> = (props) => { @@ -89,7 +87,6 @@ const ForceConfirmationDialog: React.FC<{ {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.FORCE.confirmation.conflicts.label', 'You are about to drop the following changes:')} {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.FORCE.confirmation.message', 'Do you wish to proceed? Be careful: This cannot be undone!')} diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx index 9eaca5d2b9..a0ed6016f9 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ResolutionStrategySelectionDialog.tsx @@ -9,7 +9,7 @@ */ import React from 'react'; -import {I18nRegistry, translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {WorkspaceName} from '@neos-project/neos-ts-interfaces'; import {Button, Dialog, Icon, SelectBox, SelectBox_Option_MultiLineWithThumbnail} from '@neos-project/react-ui-components'; import {Conflict, ResolutionStrategy, SyncingPhase} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; @@ -63,7 +63,6 @@ export const ResolutionStrategySelectionDialog: React.FC<{ baseWorkspaceName: WorkspaceName; conflicts: Conflict[]; defaultStrategy: null | ResolutionStrategy; - i18n: I18nRegistry; onCancel: () => void; onSelectResolutionStrategy: (strategy: ResolutionStrategy) => void; }> = (props) => { @@ -93,7 +92,7 @@ export const ResolutionStrategySelectionDialog: React.FC<{ ) }; }) - }, [props.i18n, props.workspaceName]); + }, [props.workspaceName]); const handleSelectResolutionStrategy = React.useCallback((value: string) => { setSelectedResolutionStrategy(parseInt(value, 10)); }, []); @@ -151,7 +150,6 @@ export const ResolutionStrategySelectionDialog: React.FC<{
{translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.prompt', 'In order to proceed, you need to decide what to do with the conflicting changes:')} diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/SyncWorkspaceDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/SyncWorkspaceDialog.tsx index 6b3ea714d7..a61ed928a3 100644 --- a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/SyncWorkspaceDialog.tsx +++ b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/SyncWorkspaceDialog.tsx @@ -11,11 +11,9 @@ import React from 'react'; // @ts-ignore import {connect} from 'react-redux'; -import {neos} from '@neos-project/neos-ui-decorators'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; import {GlobalState} from '@neos-project/neos-ui-redux-store/src/System'; import type {WorkspaceName} from '@neos-project/neos-ts-interfaces'; -import type {I18nRegistry} from '@neos-project/neos-ui-i18n'; import {ResolutionStrategy, SyncingPhase, State as SyncingState} from '@neos-project/neos-ui-redux-store/src/CR/Syncing'; import {ConfirmationDialog} from './ConfirmationDialog'; @@ -49,14 +47,6 @@ const withReduxState = connect((state: GlobalState): SyncWorkspaceDialogPropsFro acknowledge: actions.CR.Syncing.acknowledge }); -type SyncWorkspaceDialogPropsFromNeosGlobals = { - i18nRegistry: I18nRegistry; -}; - -const withNeosGlobals = neos((globalRegistry): SyncWorkspaceDialogPropsFromNeosGlobals => ({ - i18nRegistry: globalRegistry.get('i18n') -})); - type SyncWorkspaceDialogHandlers = { confirm: () => void; cancel: () => void; @@ -69,7 +59,6 @@ type SyncWorkspaceDialogHandlers = { type SyncWorkspaceDialogProps = & SyncWorkspaceDialogPropsFromReduxState - & SyncWorkspaceDialogPropsFromNeosGlobals & SyncWorkspaceDialogHandlers; const SyncWorkspaceDialog: React.FC = (props) => { @@ -119,7 +108,6 @@ const SyncWorkspaceDialog: React.FC = (props) => { baseWorkspaceName={props.baseWorkspaceName} conflicts={props.syncingState.process.conflicts} defaultStrategy={props.syncingState.process.strategy} - i18n={props.i18nRegistry} onCancel={handleCancel} onSelectResolutionStrategy={handleSelectResolutionStrategy} /> @@ -132,7 +120,6 @@ const SyncWorkspaceDialog: React.FC = (props) => { totalNumberOfChangesInWorkspace={props.totalNumberOfChangesInWorkspace} strategy={props.syncingState.process.strategy} conflicts={props.syncingState.process.conflicts} - i18n={props.i18nRegistry} onCancelConflictResolution={handleCancelConflictResolution} onConfirmResolutionStrategy={handleConfirmResolutionStrategy} /> @@ -153,4 +140,4 @@ const SyncWorkspaceDialog: React.FC = (props) => { } }; -export default withReduxState(withNeosGlobals(SyncWorkspaceDialog as any)); +export default withReduxState(SyncWorkspaceDialog as any); From 1677be14dd92a61b1b18afcf1c474634b216b151 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 12:38:39 +0100 Subject: [PATCH 05/15] TASK: Replace simple usages of across the codebase Using the regex ``` ``` and replacing it via ``` {translate('$1', '$2')} ``` To target ``` ``` And migrate it to ``` {translate('Neos.Neos:Main:cancel', 'Cancel')} ``` Manual adjustments, to adjust the imports and fix cases where the replaced code would have too many braces like here were fixed according to the linter {someExpression && {translate(...)}} --- .../src/InsertModeSelector/index.js | 8 +++--- .../Image/Components/ResizeControls/index.js | 6 ++--- .../src/container/ErrorView/ErrorView.tsx | 25 ++++++++----------- .../src/Containers/Modals/InsertMode/index.js | 4 +-- .../Modals/KeyboardShortcutModal/index.js | 4 +-- .../Modals/NodeCreationDialog/index.js | 6 ++--- .../Modals/NodeVariantCreationDialog/index.js | 10 ++++---- .../Containers/Modals/ReloginDialog/index.js | 10 ++++---- .../Containers/Modals/SelectNodeType/index.js | 4 +-- .../Modals/UnappliedChangesDialog/index.js | 12 +++------ .../PrimaryToolbar/DimensionSwitcher/index.js | 6 ++--- .../PrimaryToolbar/PublishDropDown/index.js | 12 ++++----- .../RightSideBar/Inspector/index.js | 6 ++--- 13 files changed, 51 insertions(+), 62 deletions(-) diff --git a/packages/neos-ui-containers/src/InsertModeSelector/index.js b/packages/neos-ui-containers/src/InsertModeSelector/index.js index a4df6b9148..dad4207070 100644 --- a/packages/neos-ui-containers/src/InsertModeSelector/index.js +++ b/packages/neos-ui-containers/src/InsertModeSelector/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import {ButtonGroup, Button, ResourceIcon} from '@neos-project/react-ui-components'; import {neos} from '@neos-project/neos-ui-decorators'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; @@ -103,7 +103,7 @@ export default class InsertModeSelector extends PureComponent { title={`${i18nRegistry.translate('Neos.Neos:Main:insert')} ${i18nRegistry.translate('above')}`} > - + {translate('Neos.Neos.Ui:Main:above', 'Above')} diff --git a/packages/neos-ui-editors/src/Editors/Image/Components/ResizeControls/index.js b/packages/neos-ui-editors/src/Editors/Image/Components/ResizeControls/index.js index 2a9160ac61..931d93b521 100644 --- a/packages/neos-ui-editors/src/Editors/Image/Components/ResizeControls/index.js +++ b/packages/neos-ui-editors/src/Editors/Image/Components/ResizeControls/index.js @@ -2,9 +2,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import {TextInput, CheckBox} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; +import {translate} from '@neos-project/neos-ui-i18n'; const buildResizeAdjustment = (width, height) => ({ allowUpScaling: null, @@ -49,7 +49,7 @@ const ResizeControls = props => { return (
-
:
+
{translate('width', 'Width')}:
{
-
:
+
{translate('height', 'Height')}:
= (props) => { return (
- + {errorMessage(props.error)} {isDevelopmentContext() ? ( ) : null} @@ -26,25 +26,20 @@ export const ErrorView: React.FC<{ error: null | AnyError }> = (props) => { ); }; -const ErrorMessage: React.FC<{ error: null | AnyError }> = (props) => { - if (isECMAScriptError(props.error)) { - return (<>{props.error.message}); +const errorMessage = (error: null|AnyError) => { + if (isECMAScriptError(error)) { + return error.message; } - if (isServerSideError(props.error)) { - return (<>#{props.error.code}: {props.error.message}); + if (isServerSideError(error)) { + return `#${error.code}: ${error.message}`; } - if (isStringError(props.error)) { - return (<>{props.error}); + if (isStringError(error)) { + return error; } - return ( - - ); + return translate('Neos.Neos.Ui:Error:unknown', 'An unkown error ocurred.'); }; const isDevelopmentContext = () => { diff --git a/packages/neos-ui/src/Containers/Modals/InsertMode/index.js b/packages/neos-ui/src/Containers/Modals/InsertMode/index.js index 0a1a371794..6e7ec91cd8 100644 --- a/packages/neos-ui/src/Containers/Modals/InsertMode/index.js +++ b/packages/neos-ui/src/Containers/Modals/InsertMode/index.js @@ -130,7 +130,7 @@ export default class InsertModeModal extends PureComponent { hoverStyle="brand" onClick={this.handleCancel} > - + {translate('Neos.Neos:Main:cancel', 'Cancel')} ); } @@ -145,7 +145,7 @@ export default class InsertModeModal extends PureComponent { onClick={this.handleApply} className={style.applyBtn} > - + {translate('Neos.Neos:Main:apply', 'Apply')} ); } diff --git a/packages/neos-ui/src/Containers/Modals/KeyboardShortcutModal/index.js b/packages/neos-ui/src/Containers/Modals/KeyboardShortcutModal/index.js index 6ced2b6618..3f26ad6983 100644 --- a/packages/neos-ui/src/Containers/Modals/KeyboardShortcutModal/index.js +++ b/packages/neos-ui/src/Containers/Modals/KeyboardShortcutModal/index.js @@ -4,7 +4,7 @@ import {connect} from 'react-redux'; import {neos} from '@neos-project/neos-ui-decorators'; import {actions} from '@neos-project/neos-ui-redux-store'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import {Dialog, Button} from '@neos-project/react-ui-components'; import style from './style.module.css'; @@ -41,7 +41,7 @@ class KeyboardShortcutModal extends PureComponent { hoverStyle="brand" onClick={() => this.props.close()} > - + {translate('Neos.Neos:Main:close', 'Close')} ); } diff --git a/packages/neos-ui/src/Containers/Modals/NodeCreationDialog/index.js b/packages/neos-ui/src/Containers/Modals/NodeCreationDialog/index.js index 3724de38bb..514ba359ab 100644 --- a/packages/neos-ui/src/Containers/Modals/NodeCreationDialog/index.js +++ b/packages/neos-ui/src/Containers/Modals/NodeCreationDialog/index.js @@ -10,7 +10,7 @@ import validate from '@neos-project/neos-ui-validators'; import preprocessNodeConfiguration from '../../../preprocessNodeConfiguration'; import {Icon, Button, Dialog} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import EditorEnvelope from '@neos-project/neos-ui-editors/src/EditorEnvelope/index'; import style from './style.module.css'; @@ -210,7 +210,7 @@ export default class NodeCreationDialog extends PureComponent { hoverStyle="brand" onClick={this.handleBack} > - + {translate('Neos.Neos:Main:back', 'Back')} ); } @@ -238,7 +238,7 @@ export default class NodeCreationDialog extends PureComponent { disabled={validationErrors && isDirty} > - + {translate('Neos.Neos:Main:createNew', 'Create')} ); } diff --git a/packages/neos-ui/src/Containers/Modals/NodeVariantCreationDialog/index.js b/packages/neos-ui/src/Containers/Modals/NodeVariantCreationDialog/index.js index 13fbb9789f..d577cae831 100644 --- a/packages/neos-ui/src/Containers/Modals/NodeVariantCreationDialog/index.js +++ b/packages/neos-ui/src/Containers/Modals/NodeVariantCreationDialog/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import {connect} from 'react-redux'; import {Button, Dialog} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; import {neos} from '@neos-project/neos-ui-decorators'; @@ -63,7 +63,7 @@ export default class NodeVariantCreationDialog extends PureComponent { return (
- + {translate('Neos.Neos:Main:content.dimension.createDialog.header', 'Start with an empty or pre-filled document?')}
); @@ -77,7 +77,7 @@ export default class NodeVariantCreationDialog extends PureComponent { hoverStyle="brand" onClick={this.handleAbort} > - + {translate('Neos.Neos:Main:cancel', 'Cancel')} ); } @@ -91,7 +91,7 @@ export default class NodeVariantCreationDialog extends PureComponent { hoverStyle="brand" onClick={this.handleCreateEmpty} > - + {translate('Neos.Neos:Main:content.dimension.createDialog.createEmpty', 'Create empty')} ); } @@ -105,7 +105,7 @@ export default class NodeVariantCreationDialog extends PureComponent { hoverStyle="brand" onClick={this.handleCreateAndCopy} > - + {translate('Neos.Neos:Main:content.dimension.createDialog.createAndCopy', 'Create and copy')} ); } diff --git a/packages/neos-ui/src/Containers/Modals/ReloginDialog/index.js b/packages/neos-ui/src/Containers/Modals/ReloginDialog/index.js index f5bf7e783c..5a2a7aedbe 100644 --- a/packages/neos-ui/src/Containers/Modals/ReloginDialog/index.js +++ b/packages/neos-ui/src/Containers/Modals/ReloginDialog/index.js @@ -8,7 +8,7 @@ import backend from '@neos-project/neos-ui-backend-connector'; import fetchWithErrorHandling from '@neos-project/neos-ui-backend-connector/src/FetchWithErrorHandling/index'; import {Button, Dialog, TextInput, Tooltip} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; @neos(globalRegistry => ({ @@ -69,7 +69,7 @@ export default class ReloginDialog extends PureComponent { return ( } + title={translate('Neos.Neos:Main:login.expired', 'Your login has expired. Please log in again.')} style="narrow" isOpen id="neos-ReloginDialog" @@ -103,9 +103,9 @@ export default class ReloginDialog extends PureComponent { disabled={this.state.isLoading} className={style.loginButton} > - {this.state.isLoading ? - : - + {this.state.isLoading + ? translate('Neos.Neos:Main:authenticating', 'Authenticating') + : translate('Neos.Neos:Main:login', 'Login') } diff --git a/packages/neos-ui/src/Containers/Modals/SelectNodeType/index.js b/packages/neos-ui/src/Containers/Modals/SelectNodeType/index.js index 178f88c76e..7f47feebaf 100644 --- a/packages/neos-ui/src/Containers/Modals/SelectNodeType/index.js +++ b/packages/neos-ui/src/Containers/Modals/SelectNodeType/index.js @@ -8,7 +8,7 @@ import {neos} from '@neos-project/neos-ui-decorators'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {Button, Dialog} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {InsertModeSelector} from '@neos-project/neos-ui-containers'; import NodeTypeGroupPanel from './nodeTypeGroupPanel'; @@ -185,7 +185,7 @@ export default class SelectNodeType extends PureComponent { hoverStyle="brand" onClick={this.handleCancel} > - + {translate('Neos.Neos:Main:cancel', 'Cancel')} ); } diff --git a/packages/neos-ui/src/Containers/Modals/UnappliedChangesDialog/index.js b/packages/neos-ui/src/Containers/Modals/UnappliedChangesDialog/index.js index 7fb8f3e470..a13d2c0c37 100644 --- a/packages/neos-ui/src/Containers/Modals/UnappliedChangesDialog/index.js +++ b/packages/neos-ui/src/Containers/Modals/UnappliedChangesDialog/index.js @@ -6,7 +6,7 @@ import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {neos} from '@neos-project/neos-ui-decorators'; import {Icon, Dialog, Button} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; @@ -64,10 +64,7 @@ export default class UnappliedChangesDialog extends PureComponent {
- + {translate('Neos.Neos:Main:content.inspector.unappliedChangesDialog.header', 'You still have changes. What do you want to do with them?')}
@@ -143,10 +140,7 @@ export default class UnappliedChangesDialog extends PureComponent { id="neos-UnappliedChangesDialog" >
- + {translate('Neos.Neos:Main:content.inspector.unappliedChangesDialog.header', 'You still have changes. What do you want to do with them?')}
); diff --git a/packages/neos-ui/src/Containers/PrimaryToolbar/DimensionSwitcher/index.js b/packages/neos-ui/src/Containers/PrimaryToolbar/DimensionSwitcher/index.js index 46a8293231..099fc7524c 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/DimensionSwitcher/index.js +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/DimensionSwitcher/index.js @@ -6,7 +6,7 @@ import style from './style.module.css'; import backend from '@neos-project/neos-ui-backend-connector'; import mapValues from 'lodash.mapvalues'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import {neos} from '@neos-project/neos-ui-decorators'; import DimensionSelector from './DimensionSelector'; @@ -234,14 +234,14 @@ export default class DimensionSwitcher extends PureComponent { style="lighter" className={style.cancelButton} > - + {translate('Neos.Neos:Main:cancel', 'Cancel')}
} diff --git a/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js b/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js index cccae81dda..391784358c 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js @@ -6,7 +6,7 @@ import mergeClassNames from 'classnames'; import {Badge, Icon, DropDown} from '@neos-project/react-ui-components'; -import I18n, {translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {PublishingMode, PublishingScope} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; import {neos} from '@neos-project/neos-ui-decorators'; @@ -147,7 +147,7 @@ export default class PublishDropDown extends PureComponent {
- + {translate('Neos.Neos:Main:publishAll', 'Publish All')} {publishableNodesCount > 0 && } @@ -163,7 +163,7 @@ export default class PublishDropDown extends PureComponent {
- + {translate('Neos.Neos:Main:discard', 'Discard')} {publishableNodesInDocumentCount > 0 && } @@ -177,7 +177,7 @@ export default class PublishDropDown extends PureComponent {
- + {translate('Neos.Neos:Main:discardAll', 'Discard All')} {publishableNodesCount > 0 && } @@ -186,7 +186,7 @@ export default class PublishDropDown extends PureComponent {
- + {translate('Neos.Neos:Main:reviewChanges', 'Review changes')} )}
  • @@ -194,7 +194,7 @@ export default class PublishDropDown extends PureComponent {
    - + {translate('Neos.Neos:Main:workspaces', 'Workspaces')}
  • diff --git a/packages/neos-ui/src/Containers/RightSideBar/Inspector/index.js b/packages/neos-ui/src/Containers/RightSideBar/Inspector/index.js index 0bc381a4cc..8ac2d447ee 100644 --- a/packages/neos-ui/src/Containers/RightSideBar/Inspector/index.js +++ b/packages/neos-ui/src/Containers/RightSideBar/Inspector/index.js @@ -5,7 +5,7 @@ import {produce} from 'immer'; import mapValues from 'lodash.mapvalues'; import {connect} from 'react-redux'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {Bar, Button, Tabs, Icon, Badge} from '@neos-project/react-ui-components'; import debounce from 'lodash.debounce'; @@ -433,10 +433,10 @@ export default class Inspector extends PureComponent { { From 85af621c7ab8e5f982c2f2f2adbec2d7f7f60198 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 14:02:01 +0100 Subject: [PATCH 06/15] TASK: Replace simple usages of `i18nRegistry` across the codebase Using the regex ``` (?<=[ {])(this.props.)?i18nRegistry\.translate\('Neos. ``` and replacing it via ``` translate('Neos. ``` To target all shorthand translations like `Neos.Neos:...` or from Neos.Neos.Ui. Also adjusted the imports and remove the injections of i18nRegistry if now obsolete --- .../src/EditorToolbar/LinkButton.js | 10 ++---- .../src/InsertModeSelector/index.js | 6 ++-- .../AssetEditor/Components/Controls/index.js | 10 ++---- .../src/Editors/AssetEditor/index.js | 13 ++++---- .../Image/Components/Controls/index.js | 20 +++++------- .../src/Editors/Range/index.js | 14 +++------ .../src/Editors/Reference/index.js | 9 +++--- .../src/Editors/References/index.js | 9 +++--- .../DataSourceBasedSelectBoxEditor.js | 9 +++--- .../SelectBox/SimpleSelectBoxEditor.js | 9 +++--- .../src/Editors/SelectBox/selectBoxHelpers.ts | 3 +- .../neos-ui-editors/src/Library/LinkInput.js | 21 +++++++------ .../src/Library/LinkInputOptions.js | 16 +++++----- .../SecondaryEditors/ImageCropper/index.js | 12 +++---- .../container/ErrorBoundary/ErrorBoundary.tsx | 31 ++++++++++--------- .../Containers/LeftSideBar/NodeTree/index.js | 17 +++++----- .../NodeTreeSearchBar/NodeTreeFilter/index.js | 5 +-- .../Buttons/ToggleContentTree/index.js | 11 +++---- .../src/Containers/LeftSideBar/index.js | 11 +++---- .../src/Containers/Modals/InsertMode/index.js | 2 +- .../Containers/Modals/ReloginDialog/index.js | 13 +++----- .../Containers/Modals/SelectNodeType/index.js | 8 ++--- .../DimensionSwitcher/DimensionSelector.js | 14 +++------ .../PrimaryToolbar/MenuToggler/index.js | 12 ++----- .../WorkspaceSelector/index.js | 15 +++------ .../PrimaryToolbar/PublishDropDown/index.js | 13 ++------ .../src/Containers/RightSideBar/index.js | 9 +++--- packages/neos-ui/src/Containers/Root.js | 2 +- .../FullScreenButton/index.js | 16 ++++------ .../KeyboardShortcutButton/index.js | 9 +++--- .../SecondaryToolbar/PreviewButton/index.js | 17 ++++------ 31 files changed, 154 insertions(+), 212 deletions(-) diff --git a/packages/neos-ui-ckeditor5-bindings/src/EditorToolbar/LinkButton.js b/packages/neos-ui-ckeditor5-bindings/src/EditorToolbar/LinkButton.js index 142515a1d4..33db1bbafe 100644 --- a/packages/neos-ui-ckeditor5-bindings/src/EditorToolbar/LinkButton.js +++ b/packages/neos-ui-ckeditor5-bindings/src/EditorToolbar/LinkButton.js @@ -5,19 +5,16 @@ import {connect} from 'react-redux'; import LinkInput from '@neos-project/neos-ui-editors/src/Library/LinkInput'; import {IconButton} from '@neos-project/react-ui-components'; -import {neos} from '@neos-project/neos-ui-decorators'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; import style from './LinkButton.module.css'; +import {translate} from '@neos-project/neos-ui-i18n'; @connect(state => ({ isOpen: selectors.UI.ContentCanvas.isLinkEditorOpen(state) }), { toggle: actions.UI.ContentCanvas.toggleLinkEditor }) -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) export default class LinkButton extends PureComponent { static propTypes = { formattingUnderCursor: PropTypes.objectOf(PropTypes.oneOfType([ @@ -28,7 +25,6 @@ export default class LinkButton extends PureComponent { ])), inlineEditorOptions: PropTypes.object, executeCommand: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired, isOpen: PropTypes.bool.isRequired, toggle: PropTypes.func.isRequired }; @@ -74,12 +70,12 @@ export default class LinkButton extends PureComponent { } render() { - const {i18nRegistry, inlineEditorOptions, isOpen} = this.props; + const {inlineEditorOptions, isOpen} = this.props; return (
    {translate('Neos.Neos.Ui:Main:above', 'Above')} @@ -111,7 +111,7 @@ export default class InsertModeSelector extends PureComponent { disabled={!enableAlongsideModes} style="lighter" size="small" - title={`${i18nRegistry.translate('Neos.Neos:Main:insert')} ${i18nRegistry.translate('below')}`} + title={`${translate('Neos.Neos:Main:insert')} ${i18nRegistry.translate('below')}`} > {translate('Neos.Neos.Ui:Main:below', 'Below')} @@ -122,7 +122,7 @@ export default class InsertModeSelector extends PureComponent { disabled={!enableIntoMode} style="lighter" size="small" - title={`${i18nRegistry.translate('Neos.Neos:Main:insert')} ${i18nRegistry.translate('into')}`} + title={`${translate('Neos.Neos:Main:insert')} ${i18nRegistry.translate('into')}`} > {translate('Neos.Neos.Ui:Main:inside', 'Inside')} diff --git a/packages/neos-ui-editors/src/Editors/AssetEditor/Components/Controls/index.js b/packages/neos-ui-editors/src/Editors/AssetEditor/Components/Controls/index.js index 863a55d881..63f08e4739 100644 --- a/packages/neos-ui-editors/src/Editors/AssetEditor/Components/Controls/index.js +++ b/packages/neos-ui-editors/src/Editors/AssetEditor/Components/Controls/index.js @@ -2,16 +2,12 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import style from './style.module.css'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; -import {neos} from '@neos-project/neos-ui-decorators'; +import {translate} from '@neos-project/neos-ui-i18n'; -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) export default class Controls extends PureComponent { static propTypes = { onChooseFromMedia: PropTypes.func.isRequired, onChooseFromLocalFileSystem: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired, isUploadEnabled: PropTypes.bool.isRequired, isMediaBrowserEnabled: PropTypes.bool.isRequired }; @@ -26,7 +22,7 @@ export default class Controls extends PureComponent { style="lighter" onClick={disabled ? null : this.props.onChooseFromMedia} className={style.button} - title={this.props.i18nRegistry.translate('Neos.Neos:Main:media')} + title={translate('Neos.Neos:Main:media')} disabled={disabled} />} {isUploadEnabled && }
    diff --git a/packages/neos-ui-editors/src/Editors/AssetEditor/index.js b/packages/neos-ui-editors/src/Editors/AssetEditor/index.js index b778ef6984..8f19a27df6 100644 --- a/packages/neos-ui-editors/src/Editors/AssetEditor/index.js +++ b/packages/neos-ui-editors/src/Editors/AssetEditor/index.js @@ -11,6 +11,7 @@ import {selectors} from '@neos-project/neos-ui-redux-store'; import AssetOption from '../../Library/AssetOption'; import {AssetUpload} from '../../Library/index'; import backend from '@neos-project/neos-ui-backend-connector'; +import {translate} from '@neos-project/neos-ui-i18n'; const DEFAULT_FEATURES = { mediaBrowser: true, @@ -267,7 +268,7 @@ export default class AssetEditor extends PureComponent { return ( @@ -294,7 +295,7 @@ export default class AssetEditor extends PureComponent { diff --git a/packages/neos-ui-editors/src/Editors/Image/Components/Controls/index.js b/packages/neos-ui-editors/src/Editors/Image/Components/Controls/index.js index 11754c4dff..7466f058b7 100644 --- a/packages/neos-ui-editors/src/Editors/Image/Components/Controls/index.js +++ b/packages/neos-ui-editors/src/Editors/Image/Components/Controls/index.js @@ -2,11 +2,8 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import style from './style.module.css'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; -import {neos} from '@neos-project/neos-ui-decorators'; +import {translate} from '@neos-project/neos-ui-i18n'; -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) export default class Controls extends PureComponent { static propTypes = { onChooseFromMedia: PropTypes.func.isRequired, @@ -16,9 +13,7 @@ export default class Controls extends PureComponent { disabled: PropTypes.bool, isUploadEnabled: PropTypes.bool.isRequired, - isMediaBrowserEnabled: PropTypes.bool.isRequired, - - i18nRegistry: PropTypes.object.isRequired + isMediaBrowserEnabled: PropTypes.bool.isRequired }; render() { @@ -37,7 +32,6 @@ export default class Controls extends PureComponent { isUploadEnabled, isMediaBrowserEnabled, onRemove, - i18nRegistry, disabled } = this.props; @@ -54,7 +48,7 @@ export default class Controls extends PureComponent { style="lighter" onClick={handleChooseFromMedia()} className={style.button} - title={i18nRegistry.translate('Neos.Neos:Main:media')} + title={translate('Neos.Neos:Main:media')} disabled={disabled} /> } @@ -65,7 +59,7 @@ export default class Controls extends PureComponent { style="lighter" onClick={handleChooseFromLocalFileSystem()} className={style.button} - title={i18nRegistry.translate('Neos.Media.Browser:Main:chooseFile')} + title={translate('Neos.Media.Browser:Main:chooseFile')} disabled={disabled} /> } @@ -76,14 +70,14 @@ export default class Controls extends PureComponent { onClick={handleRemove()} disabled={!onRemove || disabled} className={style.button} - title={i18nRegistry.translate('Neos.Neos:Main:remove')} + title={translate('Neos.Neos:Main:remove')} />
    ); } renderisCropperVisibleButton() { - const {onCrop, i18nRegistry, disabled} = this.props; + const {onCrop, disabled} = this.props; const handleCrop = () => disabled ? null : onCrop; @@ -95,7 +89,7 @@ export default class Controls extends PureComponent { style="lighter" className={style.cropButton} onClick={handleCrop()} - title={i18nRegistry.translate('Neos.Neos:Main:crop')} + title={translate('Neos.Neos:Main:crop')} disabled={disabled} /> ); diff --git a/packages/neos-ui-editors/src/Editors/Range/index.js b/packages/neos-ui-editors/src/Editors/Range/index.js index f0fa8d4b98..262b7a34dc 100755 --- a/packages/neos-ui-editors/src/Editors/Range/index.js +++ b/packages/neos-ui-editors/src/Editors/Range/index.js @@ -1,19 +1,13 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; -import {neos} from '@neos-project/neos-ui-decorators'; import style from './style.module.css'; +import {translate} from '@neos-project/neos-ui-i18n'; -@neos(globalRegistry => { - return { - i18nRegistry: globalRegistry.get('i18n') - }; -}) class RangeEditor extends PureComponent { static propTypes = { value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), commit: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired, options: PropTypes.shape({ min: PropTypes.number, max: PropTypes.number, @@ -89,12 +83,12 @@ class RangeEditor extends PureComponent { disabled={options.disabled} />
    - + {options.minLabel ? options.minLabel : options.min + options.unit} {options.unit} - + {options.maxLabel ? options.maxLabel : options.max + options.unit}
    diff --git a/packages/neos-ui-editors/src/Editors/Reference/index.js b/packages/neos-ui-editors/src/Editors/Reference/index.js index cdf96a356e..cb092b93c4 100644 --- a/packages/neos-ui-editors/src/Editors/Reference/index.js +++ b/packages/neos-ui-editors/src/Editors/Reference/index.js @@ -9,6 +9,7 @@ import {connect} from 'react-redux'; import {actions} from '@neos-project/neos-ui-redux-store'; import {sanitizeOptions} from '../../Library'; +import {translate} from '@neos-project/neos-ui-i18n'; @connect((state) => ({ creationDialogIsOpen: state?.ui?.nodeCreationDialog?.isOpen, @@ -60,16 +61,16 @@ export default class ReferenceEditor extends PureComponent { optionValueField="identifier" displaySearchBox={true} ListPreviewElement={NodeOption} - createNewLabel={i18nRegistry.translate('Neos.Neos:Main:createNew')} - noMatchesFoundLabel={i18nRegistry.translate('Neos.Neos:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={i18nRegistry.translate('Neos.Neos:Main:searchBoxLeftToType')} + createNewLabel={translate('Neos.Neos:Main:createNew')} + noMatchesFoundLabel={translate('Neos.Neos:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos:Main:searchBoxLeftToType')} placeholder={i18nRegistry.translate(this.props.placeholder)} threshold={threshold} options={sanitizeOptions(options)} value={value} onValueChange={this.handleValueChange} onHeaderClick={() => this.handleClick(options[0].uri)} - loadingLabel={i18nRegistry.translate('Neos.Neos:Main:loading')} + loadingLabel={translate('Neos.Neos:Main:loading')} displayLoadingIndicator={displayLoadingIndicator} showDropDownToggle={false} allowEmpty={true} diff --git a/packages/neos-ui-editors/src/Editors/References/index.js b/packages/neos-ui-editors/src/Editors/References/index.js index 02166acbd3..fc98571473 100644 --- a/packages/neos-ui-editors/src/Editors/References/index.js +++ b/packages/neos-ui-editors/src/Editors/References/index.js @@ -8,6 +8,7 @@ import {dndTypes} from '@neos-project/neos-ui-constants'; import {neos} from '@neos-project/neos-ui-decorators'; import {connect} from 'react-redux'; import {actions} from '@neos-project/neos-ui-redux-store'; +import {translate} from '@neos-project/neos-ui-i18n'; import {sanitizeOptions} from '../../Library'; @@ -59,14 +60,14 @@ export default class ReferencesEditor extends PureComponent { className={className} dndType={dndTypes.MULTISELECT} optionValueField="identifier" - loadingLabel={i18nRegistry.translate('Neos.Neos:Main:loading')} + loadingLabel={translate('Neos.Neos:Main:loading')} displaySearchBox={true} ListPreviewElement={NodeOption} - createNewLabel={i18nRegistry.translate('Neos.Neos:Main:createNew')} + createNewLabel={translate('Neos.Neos:Main:createNew')} placeholder={i18nRegistry.translate(placeholder)} threshold={threshold} - noMatchesFoundLabel={i18nRegistry.translate('Neos.Neos:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={i18nRegistry.translate('Neos.Neos:Main:searchBoxLeftToType')} + noMatchesFoundLabel={translate('Neos.Neos:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos:Main:searchBoxLeftToType')} options={sanitizeOptions(options)} values={value} onValuesChange={this.handleValueChange} diff --git a/packages/neos-ui-editors/src/Editors/SelectBox/DataSourceBasedSelectBoxEditor.js b/packages/neos-ui-editors/src/Editors/SelectBox/DataSourceBasedSelectBoxEditor.js index 58325198c6..764835b208 100644 --- a/packages/neos-ui-editors/src/Editors/SelectBox/DataSourceBasedSelectBoxEditor.js +++ b/packages/neos-ui-editors/src/Editors/SelectBox/DataSourceBasedSelectBoxEditor.js @@ -7,6 +7,7 @@ import {neos} from '@neos-project/neos-ui-decorators'; import {shouldDisplaySearchBox, searchOptions, processSelectBoxOptions} from './selectBoxHelpers'; import {createSelectBoxValueStringFromPossiblyStrangeNodePropertyValue} from './createSelectBoxValueStringFromPossiblyStrangeNodePropertyValue'; import PreviewOption from '../../Library/PreviewOption'; +import {translate} from '@neos-project/neos-ui-i18n'; const getDataLoaderOptionsForProps = props => ({ contextNodePath: props.focusedNodePath, @@ -152,8 +153,8 @@ export default class DataSourceBasedSelectBoxEditor extends PureComponent { displaySearchBox={shouldDisplaySearchBox(options, processedSelectBoxOptions)} searchOptions={searchOptions(this.state.searchTerm, processedSelectBoxOptions)} onSearchTermChange={this.handleSearchTermChange} - noMatchesFoundLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:searchBoxLeftToType')} + noMatchesFoundLabel={translate('Neos.Neos:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos:Main:searchBoxLeftToType')} threshold={options.threshold} disabled={options.disabled} />); @@ -172,8 +173,8 @@ export default class DataSourceBasedSelectBoxEditor extends PureComponent { allowEmpty={options.allowEmpty} displaySearchBox={shouldDisplaySearchBox(options, processedSelectBoxOptions)} onSearchTermChange={this.handleSearchTermChange} - noMatchesFoundLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:searchBoxLeftToType')} + noMatchesFoundLabel={translate('Neos.Neos:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos:Main:searchBoxLeftToType')} threshold={options.threshold} disabled={options.disabled} />); diff --git a/packages/neos-ui-editors/src/Editors/SelectBox/SimpleSelectBoxEditor.js b/packages/neos-ui-editors/src/Editors/SelectBox/SimpleSelectBoxEditor.js index e4137fa02b..58ab71c6a4 100644 --- a/packages/neos-ui-editors/src/Editors/SelectBox/SimpleSelectBoxEditor.js +++ b/packages/neos-ui-editors/src/Editors/SelectBox/SimpleSelectBoxEditor.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import {SelectBox, MultiSelectBox} from '@neos-project/react-ui-components'; import {neos} from '@neos-project/neos-ui-decorators'; import {shouldDisplaySearchBox, searchOptions, processSelectBoxOptions} from './selectBoxHelpers'; +import {translate} from '@neos-project/neos-ui-i18n'; @neos(globalRegistry => ({ i18nRegistry: globalRegistry.get('i18n') @@ -69,8 +70,8 @@ export default class SimpleSelectBoxEditor extends PureComponent { displaySearchBox={shouldDisplaySearchBox(options, processedSelectBoxOptions)} searchOptions={searchOptions(this.state.searchTerm, processedSelectBoxOptions)} onSearchTermChange={this.handleSearchTermChange} - noMatchesFoundLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:searchBoxLeftToType')} + noMatchesFoundLabel={translate('Neos.Neos:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos:Main:searchBoxLeftToType')} threshold={options.threshold} disabled={options.disabled} />); @@ -86,8 +87,8 @@ export default class SimpleSelectBoxEditor extends PureComponent { allowEmpty={allowEmpty} displaySearchBox={shouldDisplaySearchBox(options, processedSelectBoxOptions)} onSearchTermChange={this.handleSearchTermChange} - noMatchesFoundLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:searchBoxLeftToType')} + noMatchesFoundLabel={translate('Neos.Neos:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos:Main:searchBoxLeftToType')} threshold={options.threshold} disabled={options.disabled} />); diff --git a/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.ts b/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.ts index cff8a01dbe..c9040d19c9 100644 --- a/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.ts +++ b/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.ts @@ -1,5 +1,6 @@ import {I18nRegistry} from '@neos-project/neos-ts-interfaces'; import {isNil} from '@neos-project/utils-helpers'; +import {translate} from '@neos-project/neos-ui-i18n'; type RawSelectBoxOptions = {value: string, icon?: string; disabled?: boolean; label: string;}[]|{[key: string]: {icon?: string; disabled?: boolean; label: string;}}; @@ -42,7 +43,7 @@ export const processSelectBoxOptions = (i18nRegistry: I18nRegistry, selectBoxOpt // Mismatch detected. Thus we add an option to the schema so the value is displayable: https://github.com/neos/neos-ui/issues/3520 processedSelectBoxOptions.push({ value: singleValue, - label: `${i18nRegistry.translate('Neos.Neos.Ui:Main:invalidValue')}: "${singleValue}"`, + label: `${translate('Neos.Neos.Ui:Main:invalidValue')}: "${singleValue}"`, icon: 'exclamation-triangle' }); } diff --git a/packages/neos-ui-editors/src/Library/LinkInput.js b/packages/neos-ui-editors/src/Library/LinkInput.js index 00c47b5367..417e9f1564 100644 --- a/packages/neos-ui-editors/src/Library/LinkInput.js +++ b/packages/neos-ui-editors/src/Library/LinkInput.js @@ -12,6 +12,7 @@ import {isUri, isEmail} from '@neos-project/utils-helpers'; import {sanitizeOptions, sanitizeOption} from './sanitizeOptions'; import style from './LinkInput.module.css'; +import {translate} from '@neos-project/neos-ui-i18n'; // TODO: extract this isInternalLink logic into a registry, possibly defining a schema and a custom data loader const isUriOrInternalLink = link => Boolean(isUri(link) || link.indexOf('node://') === 0 || link.indexOf('asset://') === 0); @@ -168,14 +169,14 @@ export default class LinkInput extends PureComponent { if (looksLikeExternalLink(searchTermWhenLookupWasTriggered)) { groupedSearchOptions.push({ - group: this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__formatOptions', 'Format options'), - label: this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__formatAsHttp', 'Format as https link?'), + group: translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__formatOptions', 'Format options'), + label: translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__formatAsHttp', 'Format as https link?'), loaderUri: `https://${searchTermWhenLookupWasTriggered}` }); } else if (isEmail(searchTermWhenLookupWasTriggered)) { groupedSearchOptions.push({ - group: this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__formatOptions', 'Format options'), - label: this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__formatAsEmail', 'Format as email?'), + group: translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__formatOptions', 'Format options'), + label: translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__formatAsEmail', 'Format as email?'), loaderUri: `mailto:${searchTermWhenLookupWasTriggered}` }); } @@ -186,7 +187,7 @@ export default class LinkInput extends PureComponent { .then(searchOptions => { if (searchTermWhenLookupWasTriggered === this.state.searchTerm) { searchOptions.forEach(searchOption => { - searchOption.group = 'assetSourceLabel' in searchOption ? searchOption.assetSourceLabel : this.props.i18nRegistry.translate('Neos.Neos:Main:document'); + searchOption.group = 'assetSourceLabel' in searchOption ? searchOption.assetSourceLabel : translate('Neos.Neos:Main:document'); groupedSearchOptions.push(searchOption); }); @@ -319,14 +320,14 @@ export default class LinkInput extends PureComponent { onSearchTermChange={this.handleSearchTermChange} onSearchTermKeyPress={this.handleSearchTermKeyPress} ListPreviewElement={LinkOption} - noMatchesFoundLabel={this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:searchBoxLeftToType')} + noMatchesFoundLabel={translate('Neos.Neos.Ui:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos.Ui:Main:searchBoxLeftToType')} /> ); @@ -356,7 +357,7 @@ export default class LinkInput extends PureComponent { className={style.linkInput__innerButton} icon="pencil-alt" onClick={this.handleSwitchToEditMode} - title={this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__edit', 'Edit link')} + title={translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__edit', 'Edit link')} /> ); @@ -401,7 +402,7 @@ export default class LinkInput extends PureComponent { onClick={this.handleToggleOptionsPanel} style={this.state.optionsPanelIsOpen ? 'brand' : 'transparent'} className={style.linkInput__innerButton} - title={this.state.optionsPanelIsOpen ? this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__hideOptions', 'Hide link options') : this.props.i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__showOptions', 'Link options')} + title={this.state.optionsPanelIsOpen ? translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__hideOptions', 'Hide link options') : translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__showOptions', 'Link options')} icon="cog" /> )} diff --git a/packages/neos-ui-editors/src/Library/LinkInputOptions.js b/packages/neos-ui-editors/src/Library/LinkInputOptions.js index f0999521d0..b89c66d24e 100644 --- a/packages/neos-ui-editors/src/Library/LinkInputOptions.js +++ b/packages/neos-ui-editors/src/Library/LinkInputOptions.js @@ -3,9 +3,9 @@ import React, {Fragment} from 'react'; import {TextInput, CheckBox} from '@neos-project/react-ui-components'; import style from './LinkInput.module.css'; +import {translate} from '@neos-project/neos-ui-i18n'; const LinkInputOptions = ({ - i18nRegistry, onLinkChange, linkingOptions, linkValue, @@ -25,13 +25,13 @@ const LinkInputOptions = ({ {linkingOptions?.anchor && (
    { onLinkChange(value ? `${baseValue}#${value}` : baseValue); }} @@ -42,13 +42,13 @@ const LinkInputOptions = ({ {linkingOptions?.title && (
    { onLinkTitleChange(value); }} @@ -64,7 +64,7 @@ const LinkInputOptions = ({ {i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__targetBlank', 'Open in new window')} + /> {translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__targetBlank', 'Open in new window')}
    )} {linkingOptions?.relNofollow && ( @@ -73,7 +73,7 @@ const LinkInputOptions = ({ {i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__noFollow', 'No follow')} + /> {translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__noFollow', 'No follow')}
    )}
    @@ -83,7 +83,7 @@ const LinkInputOptions = ({ {i18nRegistry.translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__download', 'is download')} + /> {translate('Neos.Neos.Ui:Main:ckeditor__toolbar__link__download', 'is download')}
    )} diff --git a/packages/neos-ui-editors/src/SecondaryEditors/ImageCropper/index.js b/packages/neos-ui-editors/src/SecondaryEditors/ImageCropper/index.js index bee71a18cd..a481d54171 100644 --- a/packages/neos-ui-editors/src/SecondaryEditors/ImageCropper/index.js +++ b/packages/neos-ui-editors/src/SecondaryEditors/ImageCropper/index.js @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import ReactCrop from 'react-image-crop'; import {Icon, IconButton, TextInput} from '@neos-project/react-ui-components'; -import {neos} from '@neos-project/neos-ui-decorators'; import AspectRatioDropDown from './AspectRatioDropDown/index'; import CropConfiguration, {CustomAspectRatioOption, LockedAspectRatioStrategy} from './model.js'; @@ -11,6 +10,7 @@ import dummyImage from '../../Editors/Image/resource/dummy-image.dataurl.svg'; import style from './style.module.css'; import './react_crop.vanilla-css'; +import {translate} from '@neos-project/neos-ui-i18n'; /** * Calculates the greatest common divisor for given numbers a, b @@ -70,9 +70,6 @@ class AspectRatioItem extends PureComponent { } } -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) export default class ImageCropper extends PureComponent { state = { cropConfiguration: CropConfiguration.fromNeosConfiguration( @@ -84,8 +81,7 @@ export default class ImageCropper extends PureComponent { static propTypes = { onComplete: PropTypes.func.isRequired, sourceImage: PropTypes.object.isRequired, - options: PropTypes.object, - i18nRegistry: PropTypes.object.isRequired + options: PropTypes.object }; componentDidMount() { @@ -181,7 +177,7 @@ export default class ImageCropper extends PureComponent { const {cropConfiguration} = this.state; const aspectRatioLocked = cropConfiguration.aspectRatioStrategy instanceof LockedAspectRatioStrategy; const allowCustomRatios = cropConfiguration.aspectRatioOptions.some(option => option instanceof CustomAspectRatioOption); - const {sourceImage, i18nRegistry} = this.props; + const {sourceImage} = this.props; const src = sourceImage.previewUri || dummyImage; const toolbarRef = el => { @@ -207,7 +203,7 @@ export default class ImageCropper extends PureComponent {
    {!aspectRatioLocked && { public state = {error: undefined}; @@ -29,13 +29,13 @@ export class ErrorBoundary extends React.Component< public render(): React.ReactNode { if (this.state.error !== undefined) { - return ; + return ; } return this.props.children; } } -const CopyTechnicalDetailsButton = (props: { error: any, i18nRegistry: I18nRegistry }) => { +const CopyTechnicalDetailsButton = (props: { error: any }) => { const [hasCopied, setCopied] = React.useState(false); const copyErrorDetails = () => { @@ -49,14 +49,15 @@ const CopyTechnicalDetailsButton = (props: { error: any, i18nRegistry: I18nRegis } return ; }; -const ReloadNeosUiButton = (props: { i18nRegistry: I18nRegistry }) => { +const ReloadNeosUiButton = () => { const [isReloading, setReload] = React.useState(false); const reload = () => { if (isReloading) { @@ -69,17 +70,17 @@ const ReloadNeosUiButton = (props: { i18nRegistry: I18nRegistry }) => { }; return ; }; -const ErrorFallback = (props: { error: any, i18nRegistry: I18nRegistry }) => { +const ErrorFallback = (props: { error: any }) => { return
    -

    {props.i18nRegistry.translate('Neos.Neos.Ui:Main:errorBoundary.title')}

    -

    {props.i18nRegistry.translate('Neos.Neos.Ui:Main:errorBoundary.description')}

    +

    {translate('Neos.Neos.Ui:Main:errorBoundary.title')}

    +

    {translate('Neos.Neos.Ui:Main:errorBoundary.description')}

    {props.error instanceof Error && <> @@ -97,11 +98,11 @@ const ErrorFallback = (props: { error: any, i18nRegistry: I18nRegistry }) => { } -

    {props.i18nRegistry.translate('Neos.Neos.Ui:Main:errorBoundary.footer')}

    +

    {translate('Neos.Neos.Ui:Main:errorBoundary.footer')}

    - - + +
    ; diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTree/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTree/index.js index 2c91381a12..c1f141ee0d 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTree/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTree/index.js @@ -13,6 +13,7 @@ import {PageTreeNode, ContentTreeNode} from './Node/index'; import style from './style.module.css'; import {neos} from '@neos-project/neos-ui-decorators'; +import {translate} from '@neos-project/neos-ui-i18n'; const ConnectedDragLayer = connect((state, {currentlyDraggedNodes}) => { const getNodeByContextPath = selectors.CR.Nodes.nodeByContextPath(state); @@ -35,8 +36,7 @@ export default class NodeTree extends PureComponent { setActiveContentCanvasContextPath: PropTypes.func, moveNodes: PropTypes.func, allCollapsibleNodes: PropTypes.object, - loadingDepth: PropTypes.number, - i18nRegistry: PropTypes.object.isRequired + loadingDepth: PropTypes.number }; state = { @@ -131,7 +131,7 @@ export default class NodeTree extends PureComponent { } render() { - const {rootNode, ChildRenderer, i18nRegistry} = this.props; + const {rootNode, ChildRenderer} = this.props; if (!rootNode) { return (
    @@ -149,7 +149,7 @@ export default class NodeTree extends PureComponent { @@ -177,12 +177,11 @@ export default class NodeTree extends PureComponent { } } -const withNodeTypeRegistryAndI18nRegistry = neos(globalRegistry => ({ - nodeTypesRegistry: globalRegistry.get('@neos-project/neos-ui-contentrepository'), - i18nRegistry: globalRegistry.get('i18n') +const withNodeTypeRegistry = neos(globalRegistry => ({ + nodeTypesRegistry: globalRegistry.get('@neos-project/neos-ui-contentrepository') })); -export const PageTree = withNodeTypeRegistryAndI18nRegistry(connect( +export const PageTree = withNodeTypeRegistry(connect( (state, {neos, nodeTypesRegistry}) => { const documentNodesSelector = selectors.CR.Nodes.makeGetCollapsibleDocumentNodes(nodeTypesRegistry); return ({ @@ -207,7 +206,7 @@ export const PageTree = withNodeTypeRegistryAndI18nRegistry(connect( } )(NodeTree)); -export const ContentTree = withNodeTypeRegistryAndI18nRegistry(connect( +export const ContentTree = withNodeTypeRegistry(connect( (state, {neos, nodeTypesRegistry}) => { const contentNodesSelector = selectors.CR.Nodes.makeGetCollapsibleContentNodes(nodeTypesRegistry); return ({ diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeSearchBar/NodeTreeFilter/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeSearchBar/NodeTreeFilter/index.js index 9ba22a90e2..c6023e9576 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeSearchBar/NodeTreeFilter/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeSearchBar/NodeTreeFilter/index.js @@ -5,6 +5,7 @@ import {neos} from '@neos-project/neos-ui-decorators'; import {SelectBox} from '@neos-project/react-ui-components'; import {searchOptions} from '@neos-project/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.js'; +import {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; @@ -70,8 +71,8 @@ export default class NodeTreeFilter extends PureComponent { searchTerm={this.state.filterTerm} onSearchTermChange={this.handleFilterTermChange} threshold={0} - noMatchesFoundLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={this.props.i18nRegistry.translate('Neos.Neos:Main:searchBoxLeftToType')} + noMatchesFoundLabel={translate('Neos.Neos:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos:Main:searchBoxLeftToType')} />
    ); diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/ToggleContentTree/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/ToggleContentTree/index.js index ed9ba0e101..93bbd1854f 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/ToggleContentTree/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/ToggleContentTree/index.js @@ -1,5 +1,6 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import style from './style.module.css'; @@ -12,9 +13,7 @@ export default class ToggleContentTree extends PureComponent { isPanelOpen: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, - - i18nRegistry: PropTypes.object.isRequired + onClick: PropTypes.func.isRequired }; handleClick = () => { @@ -24,7 +23,7 @@ export default class ToggleContentTree extends PureComponent { } render() { - const {id, isPanelOpen, i18nRegistry} = this.props; + const {id, isPanelOpen} = this.props; return (
    @@ -33,10 +32,10 @@ export default class ToggleContentTree extends PureComponent { className={style.toggleBtn} icon={isPanelOpen ? 'chevron-circle-down' : 'chevron-circle-up'} hoverStyle="clean" - aria-label={i18nRegistry.translate('Neos.Neos:Main:toggleContentTree', 'Toggle content tree')} + aria-label={translate('Neos.Neos:Main:toggleContentTree', 'Toggle content tree')} /> - {i18nRegistry.translate('Neos.Neos:Main:contentTree', 'Content Tree')} + {translate('Neos.Neos:Main:contentTree', 'Content Tree')}
    ); diff --git a/packages/neos-ui/src/Containers/LeftSideBar/index.js b/packages/neos-ui/src/Containers/LeftSideBar/index.js index ae4e90018e..c61dbbfa58 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/index.js @@ -2,6 +2,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import mergeClassNames from 'classnames'; import {connect} from 'react-redux'; +import {translate} from '@neos-project/neos-ui-i18n'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; @@ -11,8 +12,7 @@ import {neos} from '@neos-project/neos-ui-decorators'; import style from './style.module.css'; @neos(globalRegistry => ({ - containerRegistry: globalRegistry.get('containers'), - i18nRegistry: globalRegistry.get('i18n') + containerRegistry: globalRegistry.get('containers') })) @connect(state => ({ isHidden: state?.ui?.leftSideBar?.isHidden, @@ -26,7 +26,6 @@ import style from './style.module.css'; export default class LeftSideBar extends PureComponent { static propTypes = { containerRegistry: PropTypes.object.isRequired, - i18nRegistry: PropTypes.object.isRequired, isHidden: PropTypes.bool.isRequired, isHiddenContentTree: PropTypes.bool.isRequired, @@ -40,7 +39,7 @@ export default class LeftSideBar extends PureComponent { } render() { - const {isHidden, isFullScreen, isHiddenContentTree, containerRegistry, i18nRegistry} = this.props; + const {isHidden, isFullScreen, isHiddenContentTree, containerRegistry} = this.props; const classNames = mergeClassNames({ [style.leftSideBar]: true, @@ -69,7 +68,7 @@ export default class LeftSideBar extends PureComponent { icon={toggleIcon} className={style.leftSideBar__toggleBtn} hoverStyle="clean" - title={i18nRegistry.translate('Neos.Neos:Main:navigate')} + title={translate('Neos.Neos:Main:navigate')} /> ); @@ -77,7 +76,7 @@ export default class LeftSideBar extends PureComponent {
    {toggle} - {!isHidden && !isFullScreen && i18nRegistry.translate('Neos.Neos:Main:documentTree', 'Document Tree')} + {!isHidden && !isFullScreen && translate('Neos.Neos:Main:documentTree', 'Document Tree')}
    ({ - i18nRegistry: globalRegistry.get('i18n') -})) @connect(state => ({ authenticationTimeout: selectors.System.authenticationTimeout(state) }), { @@ -30,7 +26,6 @@ export default class ReloginDialog extends PureComponent { state = {...this.defaultState}; static propTypes = { - i18nRegistry: PropTypes.object.isRequired, authenticationTimeout: PropTypes.bool.isRequired, reauthenticationSucceeded: PropTypes.func.isRequired }; @@ -53,7 +48,7 @@ export default class ReloginDialog extends PureComponent { this.setState(this.defaultState); } else { this.setState({ - message: this.props.i18nRegistry.translate('Neos.Neos:Main:wrongCredentials', 'The entered username or password was wrong'), + message: translate('Neos.Neos:Main:wrongCredentials', 'The entered username or password was wrong'), isLoading: false }); } @@ -61,7 +56,7 @@ export default class ReloginDialog extends PureComponent { }; render() { - const {authenticationTimeout, i18nRegistry} = this.props; + const {authenticationTimeout} = this.props; if (!authenticationTimeout) { return null; @@ -80,7 +75,7 @@ export default class ReloginDialog extends PureComponent { containerClassName={style.inputFieldWrapper} value={this.state.username} name="__authentication[Neos][Flow][Security][Authentication][Token][UsernamePassword][username]" - placeholder={i18nRegistry.translate('Neos.Neos:Main:username', 'Username')} + placeholder={translate('Neos.Neos:Main:username', 'Username')} onChange={this.handleUsernameChange} onEnterKey={this.handleTryLogin} setFocus={true} @@ -91,7 +86,7 @@ export default class ReloginDialog extends PureComponent { containerClassName={style.inputFieldWrapper} value={this.state.password} name="__authentication[Neos][Flow][Security][Authentication][Token][UsernamePassword][password]" - placeholder={i18nRegistry.translate('Neos.Neos:Main:password', 'Password')} + placeholder={translate('Neos.Neos:Main:password', 'Password')} onChange={this.handlePasswordChange} onEnterKey={this.handleTryLogin} /> diff --git a/packages/neos-ui/src/Containers/Modals/SelectNodeType/index.js b/packages/neos-ui/src/Containers/Modals/SelectNodeType/index.js index 7f47feebaf..b42cbee4c3 100644 --- a/packages/neos-ui/src/Containers/Modals/SelectNodeType/index.js +++ b/packages/neos-ui/src/Containers/Modals/SelectNodeType/index.js @@ -196,15 +196,15 @@ export default class SelectNodeType extends PureComponent { const nodeTypeLabel = nodeTypesRegistry.get(referenceNodeType)?.ui?.label const nodeTypeLabelText = i18nRegistry.translate(nodeTypeLabel, 'Node') - const addLabel = i18nRegistry.translate('Neos.Neos.Ui:Main:add', 'Add') + const addLabel = translate('Neos.Neos.Ui:Main:add', 'Add') const insertModeLabel = (function () { switch (insertMode) { case 'into': - return i18nRegistry.translate('Neos.Neos.Ui:Main:InsertModeTitleInto', 'inside'); + return translate('Neos.Neos.Ui:Main:InsertModeTitleInto', 'inside'); case 'before': - return i18nRegistry.translate('Neos.Neos.Ui:Main:InsertModeTitleBefore', 'above'); + return translate('Neos.Neos.Ui:Main:InsertModeTitleBefore', 'above'); case 'after': - return i18nRegistry.translate('Neos.Neos.Ui:Main:InsertModeTitleAfter', 'below'); + return translate('Neos.Neos.Ui:Main:InsertModeTitleAfter', 'below'); default: return 'to'; } diff --git a/packages/neos-ui/src/Containers/PrimaryToolbar/DimensionSwitcher/DimensionSelector.js b/packages/neos-ui/src/Containers/PrimaryToolbar/DimensionSwitcher/DimensionSelector.js index 6a2360ca40..5fd80925ec 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/DimensionSwitcher/DimensionSelector.js +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/DimensionSwitcher/DimensionSelector.js @@ -5,15 +5,12 @@ import style from './style.module.css'; import mapValues from 'lodash.mapvalues'; import sortBy from 'lodash.sortby'; -import {neos} from '@neos-project/neos-ui-decorators'; +import {translate} from '@neos-project/neos-ui-i18n'; import DimensionSelectorOption from './DimensionSelectorOption'; const searchOptions = (searchTerm, processedSelectBoxOptions) => processedSelectBoxOptions.filter(option => option.label && option.label.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1); -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) export default class DimensionSelector extends PureComponent { static propTypes = { icon: PropTypes.string, @@ -23,9 +20,7 @@ export default class DimensionSelector extends PureComponent { dimensionName: PropTypes.string.isRequired, isLoading: PropTypes.bool, onSelect: PropTypes.func.isRequired, - showDropDownHeaderIcon: PropTypes.bool, - - i18nRegistry: PropTypes.object.isRequired + showDropDownHeaderIcon: PropTypes.bool }; state = { @@ -36,7 +31,6 @@ export default class DimensionSelector extends PureComponent { const { activePreset, isLoading, - i18nRegistry, dimensionName, onSelect, presets, @@ -72,8 +66,8 @@ export default class DimensionSelector extends PureComponent { displaySearchBox={false} // TODO reenable `sortedPresetOptions.length >= 10` but see https://github.com/neos/neos-ui/issues/3495 searchOptions={searchOptions(this.state.searchTerm, sortedPresetOptions)} onSearchTermChange={this.handleSearchTermChange} - noMatchesFoundLabel={i18nRegistry.translate('Neos.Neos:Main:noMatchesFound')} - searchBoxLeftToTypeLabel={i18nRegistry.translate('Neos.Neos:Main:searchBoxLeftToType')} + noMatchesFoundLabel={translate('Neos.Neos:Main:noMatchesFound')} + searchBoxLeftToTypeLabel={translate('Neos.Neos:Main:searchBoxLeftToType')} threshold={0} ListPreviewElement={DimensionSelectorOption} className={style.dimensionSwitcherDropDown} diff --git a/packages/neos-ui/src/Containers/PrimaryToolbar/MenuToggler/index.js b/packages/neos-ui/src/Containers/PrimaryToolbar/MenuToggler/index.js index 527fb3de97..0dd635b2ed 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/MenuToggler/index.js +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/MenuToggler/index.js @@ -5,14 +5,10 @@ import mergeClassNames from 'classnames'; import Button from '@neos-project/react-ui-components/src/Button/'; import {actions} from '@neos-project/neos-ui-redux-store'; -import {neos} from '@neos-project/neos-ui-decorators'; +import {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) - @connect(state => ({ isMenuHidden: state?.ui?.drawer?.isHidden }), { @@ -20,8 +16,6 @@ import style from './style.module.css'; }) export default class MenuToggler extends PureComponent { static propTypes = { - i18nRegistry: PropTypes.object.isRequired, - className: PropTypes.string, isMenuHidden: PropTypes.bool.isRequired, toggleDrawer: PropTypes.func.isRequired @@ -34,7 +28,7 @@ export default class MenuToggler extends PureComponent { } render() { - const {className, isMenuHidden, i18nRegistry} = this.props; + const {className, isMenuHidden} = this.props; const isMenuVisible = !isMenuHidden; const classNames = mergeClassNames({ [style.menuToggler]: true, @@ -53,7 +47,7 @@ export default class MenuToggler extends PureComponent { hoverStyle="clean" isFocused={isMenuVisible} onClick={this.handleToggle} - title={i18nRegistry.translate('Neos.Neos:Main:toggleMenu', 'Toggle menu')} + title={translate('Neos.Neos:Main:toggleMenu', 'Toggle menu')} aria-label="Menu" aria-controls="navigation" aria-expanded={isMenuHidden ? 'false' : 'true'} diff --git a/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/WorkspaceSelector/index.js b/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/WorkspaceSelector/index.js index ae0df14309..c3c52f9514 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/WorkspaceSelector/index.js +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/WorkspaceSelector/index.js @@ -1,21 +1,16 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; +import {translate} from '@neos-project/neos-ui-i18n'; import SelectBox from '@neos-project/react-ui-components/src/SelectBox/'; -import {neos} from '@neos-project/neos-ui-decorators'; import style from './style.module.css'; -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) - export default class WorkspaceSelector extends PureComponent { static propTypes = { baseWorkspace: PropTypes.string.isRequired, allowedWorkspaces: PropTypes.object.isRequired, changeBaseWorkspaceAction: PropTypes.func.isRequired, - changingWorkspaceAllowed: PropTypes.bool, - i18nRegistry: PropTypes.object.isRequired + changingWorkspaceAllowed: PropTypes.bool }; static contextTypes = { @@ -23,7 +18,7 @@ export default class WorkspaceSelector extends PureComponent { }; render() { - const {allowedWorkspaces, baseWorkspace, changeBaseWorkspaceAction, changingWorkspaceAllowed, i18nRegistry} = this.props; + const {allowedWorkspaces, baseWorkspace, changeBaseWorkspaceAction, changingWorkspaceAllowed} = this.props; const {context} = this; const workspacesOptions = Object.keys(allowedWorkspaces).map(i => ({label: allowedWorkspaces[i]?.title, value: allowedWorkspaces[i]?.name})); @@ -42,8 +37,8 @@ export default class WorkspaceSelector extends PureComponent { value={baseWorkspace} onValueChange={onWorkspaceSelect} /> : -
    - {baseWorkspaceTitle} – {i18nRegistry.translate('Neos.Neos:Main:content.components.dirtyWorkspaceDialog.dirtyWorkspaceHeader')} +
    + {baseWorkspaceTitle} – {translate('Neos.Neos:Main:content.components.dirtyWorkspaceDialog.dirtyWorkspaceHeader')}
    )}
    ); diff --git a/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js b/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js index 391784358c..2da367cc23 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js @@ -9,7 +9,6 @@ import {Badge, Icon, DropDown} from '@neos-project/react-ui-components'; import {translate} from '@neos-project/neos-ui-i18n'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {PublishingMode, PublishingScope} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; -import {neos} from '@neos-project/neos-ui-decorators'; const {publishableNodesSelector, publishableNodesInDocumentSelector, baseWorkspaceSelector, isWorkspaceReadOnlySelector, personalWorkspaceNameSelector} = selectors.CR.Workspaces; @@ -29,10 +28,6 @@ import style from './style.module.css'; changeBaseWorkspaceAction: actions.CR.Workspaces.changeBaseWorkspace, start: actions.CR.Publishing.start }) -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) - export default class PublishDropDown extends PureComponent { static propTypes = { isSaving: PropTypes.bool, @@ -45,8 +40,7 @@ export default class PublishDropDown extends PureComponent { neos: PropTypes.object.isRequired, start: PropTypes.func.isRequired, changeBaseWorkspaceAction: PropTypes.func.isRequired, - routes: PropTypes.object, - i18nRegistry: PropTypes.object.isRequired + routes: PropTypes.object }; handlePublishClick = () => { @@ -78,7 +72,6 @@ export default class PublishDropDown extends PureComponent { isWorkspaceReadOnly, baseWorkspace, changeBaseWorkspaceAction, - i18nRegistry, neos } = this.props; @@ -118,12 +111,12 @@ export default class PublishDropDown extends PureComponent { iconRest={{spin: true, transform: 'up-8'}} className={dropDownBtnClassName} disabled - aria-label={i18nRegistry.translate('Neos.Neos:Main:showPublishOptions', 'Show publishing options')} + aria-label={translate('Neos.Neos:Main:showPublishOptions', 'Show publishing options')} /> ) : ( )} ({ - containerRegistry: globalRegistry.get('containers'), - i18nRegistry: globalRegistry.get('i18n') + containerRegistry: globalRegistry.get('containers') })) @connect(state => ({ isHidden: selectors.UI.RightSideBar.isHidden(state), @@ -21,7 +21,6 @@ import style from './style.module.css'; export default class RightSideBar extends PureComponent { static propTypes = { containerRegistry: PropTypes.object.isRequired, - i18nRegistry: PropTypes.object.isRequired, isHidden: PropTypes.bool.isRequired, isFullScreen: PropTypes.bool.isRequired, @@ -35,7 +34,7 @@ export default class RightSideBar extends PureComponent { } render() { - const {isHidden, isFullScreen, containerRegistry, i18nRegistry} = this.props; + const {isHidden, isFullScreen, containerRegistry} = this.props; const isSideBarHidden = isHidden || isFullScreen; const classNames = mergeClassNames({ [style.rightSideBar]: true, @@ -49,7 +48,7 @@ export default class RightSideBar extends PureComponent { className={style.rightSideBar__toggleBtn} hoverStyle="clean" onClick={this.handleToggle} - title={i18nRegistry.translate('Neos.Neos:Main:toggleInspector')} + title={translate('Neos.Neos:Main:toggleInspector')} /> ); diff --git a/packages/neos-ui/src/Containers/Root.js b/packages/neos-ui/src/Containers/Root.js index 3a0cb78000..04b876d753 100644 --- a/packages/neos-ui/src/Containers/Root.js +++ b/packages/neos-ui/src/Containers/Root.js @@ -27,7 +27,7 @@ class Root extends PureComponent { const App = containerRegistry.get('App'); return ( - +
    diff --git a/packages/neos-ui/src/Containers/SecondaryToolbar/FullScreenButton/index.js b/packages/neos-ui/src/Containers/SecondaryToolbar/FullScreenButton/index.js index e2526682ca..b9862a844b 100644 --- a/packages/neos-ui/src/Containers/SecondaryToolbar/FullScreenButton/index.js +++ b/packages/neos-ui/src/Containers/SecondaryToolbar/FullScreenButton/index.js @@ -4,12 +4,9 @@ import {connect} from 'react-redux'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import {actions} from '@neos-project/neos-ui-redux-store'; -import {neos} from '@neos-project/neos-ui-decorators'; import style from './style.module.css'; +import {translate} from '@neos-project/neos-ui-i18n'; -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) @connect(state => ({ isFullScreen: state?.ui?.fullScreen?.isFullScreen }), { @@ -18,28 +15,27 @@ import style from './style.module.css'; export default class FullScreenButton extends PureComponent { static propTypes = { toggleFullScreen: PropTypes.func, - i18nRegistry: PropTypes.object.isRequired, isFullScreen: PropTypes.bool.isRequired }; render() { - const {toggleFullScreen, i18nRegistry, isFullScreen} = this.props; + const {toggleFullScreen, isFullScreen} = this.props; return isFullScreen ? ( ) : ( ); } diff --git a/packages/neos-ui/src/Containers/SecondaryToolbar/KeyboardShortcutButton/index.js b/packages/neos-ui/src/Containers/SecondaryToolbar/KeyboardShortcutButton/index.js index f738a558a1..cac036ee14 100644 --- a/packages/neos-ui/src/Containers/SecondaryToolbar/KeyboardShortcutButton/index.js +++ b/packages/neos-ui/src/Containers/SecondaryToolbar/KeyboardShortcutButton/index.js @@ -3,11 +3,11 @@ import PropTypes from 'prop-types'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import {neos} from '@neos-project/neos-ui-decorators'; import {connect} from 'react-redux'; +import {translate} from '@neos-project/neos-ui-i18n'; import {actions} from '@neos-project/neos-ui-redux-store'; @neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n'), hotkeyRegistry: globalRegistry.get('hotkeys') })) @connect( @@ -16,13 +16,12 @@ import {actions} from '@neos-project/neos-ui-redux-store'; ) export default class KeyboardShortcutButton extends PureComponent { static propTypes = { - i18nRegistry: PropTypes.object.isRequired, toggleFullScreen: PropTypes.func, hotkeyRegistry: PropTypes.object.isRequired }; render() { - const {i18nRegistry, open, hotkeyRegistry} = this.props; + const {open, hotkeyRegistry} = this.props; if (hotkeyRegistry._registry === null || hotkeyRegistry._registry.length === 0) { return null; @@ -31,8 +30,8 @@ export default class KeyboardShortcutButton extends PureComponent { return ( ); diff --git a/packages/neos-ui/src/Containers/SecondaryToolbar/PreviewButton/index.js b/packages/neos-ui/src/Containers/SecondaryToolbar/PreviewButton/index.js index 01fb23ad64..17bf2ecf3e 100644 --- a/packages/neos-ui/src/Containers/SecondaryToolbar/PreviewButton/index.js +++ b/packages/neos-ui/src/Containers/SecondaryToolbar/PreviewButton/index.js @@ -5,23 +5,18 @@ import {connect} from 'react-redux'; import mergeClassNames from 'classnames'; import style from './style.module.css'; -import {neos} from '@neos-project/neos-ui-decorators'; - -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) +import {translate} from '@neos-project/neos-ui-i18n'; @connect(state => ({ previewUrl: state?.ui?.contentCanvas?.previewUrl })) export default class PreviewButton extends PureComponent { static propTypes = { - previewUrl: PropTypes.string, - i18nRegistry: PropTypes.object.isRequired + previewUrl: PropTypes.string }; render() { - const {previewUrl, i18nRegistry} = this.props; + const {previewUrl} = this.props; const previewButtonClassNames = mergeClassNames({ [style.secondaryToolbar__buttonLink]: true, @@ -35,8 +30,8 @@ export default class PreviewButton extends PureComponent { href={previewUrl ? previewUrl : ''} target="neosPreview" className={previewButtonClassNames} - aria-label={i18nRegistry.translate('Neos.Neos:Main:showPreview', 'Show Preview')} - title={i18nRegistry.translate('Neos.Neos:Main:showPreview', 'Show Preview')} + aria-label={translate('Neos.Neos:Main:showPreview', 'Show Preview')} + title={translate('Neos.Neos:Main:showPreview', 'Show Preview')} > @@ -48,7 +43,7 @@ export default class PreviewButton extends PureComponent { id="neos-PreviewButton" className={previewButtonClassNames} disabled - aria-label={i18nRegistry.translate('Neos.Neos:Main:showPreview', 'Show Preview')} + aria-label={translate('Neos.Neos:Main:showPreview', 'Show Preview')} > From 28535ef2ebc837eb62816aab153eee629f5182f8 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 14:18:18 +0100 Subject: [PATCH 07/15] TASK: Replace usages of `i18nRegistry` without qualified package across the codebase Using the regex ``` (?<=[ {])i18nRegistry\.translate\('([^']+)'\) ``` and replacing it via ``` translate('Neos.Neos:Main:$1') ``` To target all translations like `i18nRegistry.translate('copy')` and replace them via `translate('Neos.Neos:Main:copy')` Also adjusted the imports and remove the injections of i18nRegistry if now obsolete --- .../src/InsertModeSelector/index.js | 16 +++++----------- .../NodeToolbar/Buttons/AddNode/index.js | 9 ++++----- .../Buttons/CopySelectedNode/index.js | 6 +++--- .../NodeToolbar/Buttons/CutSelectedNode/index.js | 10 ++++------ .../Buttons/DeleteSelectedNode/index.js | 9 ++++----- .../Buttons/HideSelectedNode/index.js | 9 ++++----- .../Buttons/PasteClipBoardNode/index.js | 9 ++++----- .../NodeTreeToolBar/Buttons/AddNode/index.js | 9 ++++----- .../Buttons/CopySelectedNode/index.js | 11 ++++------- .../Buttons/CutSelectedNode/index.js | 8 ++++---- .../Buttons/DeleteSelectedNode/index.js | 10 ++++------ .../Buttons/HideSelectedNode/index.js | 9 ++++----- .../Buttons/PasteClipBoardNode/index.js | 10 ++++------ .../Buttons/RefreshPageTree/index.js | 9 ++++----- .../src/Containers/Modals/DeleteNode/index.js | 9 +++++---- .../PrimaryToolbar/EditPreviewDropDown/index.js | 13 +++++-------- 16 files changed, 66 insertions(+), 90 deletions(-) diff --git a/packages/neos-ui-containers/src/InsertModeSelector/index.js b/packages/neos-ui-containers/src/InsertModeSelector/index.js index 0e6370e9c1..2fd3ad9c91 100644 --- a/packages/neos-ui-containers/src/InsertModeSelector/index.js +++ b/packages/neos-ui-containers/src/InsertModeSelector/index.js @@ -2,7 +2,6 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {ButtonGroup, Button, ResourceIcon} from '@neos-project/react-ui-components'; -import {neos} from '@neos-project/neos-ui-decorators'; import I18n, {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; @@ -38,17 +37,12 @@ const calculatePreferredInitialMode = props => { return null; }; -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) export default class InsertModeSelector extends PureComponent { static propTypes = { mode: PropTypes.string, enableAlongsideModes: PropTypes.bool.isRequired, enableIntoMode: PropTypes.bool.isRequired, - onSelect: PropTypes.func.isRequired, - - i18nRegistry: PropTypes.object.isRequired + onSelect: PropTypes.func.isRequired }; options = []; @@ -83,7 +77,7 @@ export default class InsertModeSelector extends PureComponent { } render() { - const {mode, enableIntoMode, enableAlongsideModes, i18nRegistry} = this.props; + const {mode, enableIntoMode, enableAlongsideModes} = this.props; if (!mode) { return null; @@ -100,7 +94,7 @@ export default class InsertModeSelector extends PureComponent { disabled={!enableAlongsideModes} style="lighter" size="small" - title={`${translate('Neos.Neos:Main:insert')} ${i18nRegistry.translate('above')}`} + title={`${translate('Neos.Neos:Main:insert')} ${translate('Neos.Neos:Main:above')}`} > {translate('Neos.Neos.Ui:Main:above', 'Above')} @@ -111,7 +105,7 @@ export default class InsertModeSelector extends PureComponent { disabled={!enableAlongsideModes} style="lighter" size="small" - title={`${translate('Neos.Neos:Main:insert')} ${i18nRegistry.translate('below')}`} + title={`${translate('Neos.Neos:Main:insert')} ${translate('Neos.Neos:Main:below')}`} > {translate('Neos.Neos.Ui:Main:below', 'Below')} @@ -122,7 +116,7 @@ export default class InsertModeSelector extends PureComponent { disabled={!enableIntoMode} style="lighter" size="small" - title={`${translate('Neos.Neos:Main:insert')} ${i18nRegistry.translate('into')}`} + title={`${translate('Neos.Neos:Main:insert')} ${translate('Neos.Neos:Main:into')}`} > {translate('Neos.Neos.Ui:Main:inside', 'Inside')} diff --git a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/AddNode/index.js b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/AddNode/index.js index 329b33933c..fa4c142353 100644 --- a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/AddNode/index.js +++ b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/AddNode/index.js @@ -1,7 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; - +import {translate} from '@neos-project/neos-ui-i18n'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; @@ -37,8 +37,7 @@ export default class AddNode extends PureComponent { fusionPath: PropTypes.string, className: PropTypes.string, commenceNodeCreation: PropTypes.func.isRequired, - isAllowedToAddChildOrSiblingNodes: PropTypes.bool, - i18nRegistry: PropTypes.object.isRequired + isAllowedToAddChildOrSiblingNodes: PropTypes.bool }; handleCommenceNodeCreation = () => { @@ -52,7 +51,7 @@ export default class AddNode extends PureComponent { } render() { - const {isAllowedToAddChildOrSiblingNodes, i18nRegistry} = this.props; + const {isAllowedToAddChildOrSiblingNodes} = this.props; return ( ); } diff --git a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/CopySelectedNode/index.js b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/CopySelectedNode/index.js index 8f1db2b5c4..8ca6ea0e9a 100644 --- a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/CopySelectedNode/index.js +++ b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/CopySelectedNode/index.js @@ -1,7 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import {actions} from '@neos-project/neos-ui-redux-store'; @@ -26,7 +26,7 @@ export default class CopySelectedNode extends PureComponent { } render() { - const {destructiveOperationsAreDisabled, className, isCopied, i18nRegistry} = this.props; + const {destructiveOperationsAreDisabled, className, isCopied} = this.props; return ( ); } diff --git a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/CutSelectedNode/index.js b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/CutSelectedNode/index.js index 09c9254701..897274f520 100644 --- a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/CutSelectedNode/index.js +++ b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/CutSelectedNode/index.js @@ -1,7 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import {actions} from '@neos-project/neos-ui-redux-store'; @@ -16,8 +16,7 @@ export default class CutSelectedNode extends PureComponent { destructiveOperationsAreDisabled: PropTypes.bool.isRequired, isCut: PropTypes.bool.isRequired, canBeEdited: PropTypes.bool.isRequired, - cutNode: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired + cutNode: PropTypes.func.isRequired }; handleCutSelectedNodeClick = () => { @@ -31,8 +30,7 @@ export default class CutSelectedNode extends PureComponent { destructiveOperationsAreDisabled, isCut, className, - canBeEdited, - i18nRegistry + canBeEdited } = this.props; return ( @@ -44,7 +42,7 @@ export default class CutSelectedNode extends PureComponent { onClick={this.handleCutSelectedNodeClick} icon="cut" hoverStyle="brand" - title={i18nRegistry.translate('cut')} + title={translate('Neos.Neos:Main:cut')} /> ); } diff --git a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/DeleteSelectedNode/index.js b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/DeleteSelectedNode/index.js index 18f3035852..c2e8323aae 100644 --- a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/DeleteSelectedNode/index.js +++ b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/DeleteSelectedNode/index.js @@ -1,7 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import {actions} from '@neos-project/neos-ui-redux-store'; @@ -16,8 +16,7 @@ export default class DeleteSelectedNode extends PureComponent { destructiveOperationsAreDisabled: PropTypes.bool.isRequired, canBeDeleted: PropTypes.bool.isRequired, canBeEdited: PropTypes.bool.isRequired, - commenceNodeRemoval: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired + commenceNodeRemoval: PropTypes.func.isRequired }; handleDeleteSelectedNodeClick = () => { @@ -29,7 +28,7 @@ export default class DeleteSelectedNode extends PureComponent { } render() { - const {className, destructiveOperationsAreDisabled, canBeDeleted, canBeEdited, i18nRegistry} = this.props; + const {className, destructiveOperationsAreDisabled, canBeDeleted, canBeEdited} = this.props; return ( ); } diff --git a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/HideSelectedNode/index.js b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/HideSelectedNode/index.js index 40ae0c3de0..49579008f7 100644 --- a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/HideSelectedNode/index.js +++ b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/HideSelectedNode/index.js @@ -1,7 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; @@ -20,8 +20,7 @@ export default class HideSelectedNode extends PureComponent { showNode: PropTypes.func.isRequired, destructiveOperationsAreDisabled: PropTypes.bool.isRequired, canBeEdited: PropTypes.bool.isRequired, - visibilityCanBeToggled: PropTypes.bool.isRequired, - i18nRegistry: PropTypes.object.isRequired + visibilityCanBeToggled: PropTypes.bool.isRequired }; handleHideNode = () => { @@ -41,7 +40,7 @@ export default class HideSelectedNode extends PureComponent { } render() { - const {className, node, destructiveOperationsAreDisabled, canBeEdited, visibilityCanBeToggled, i18nRegistry} = this.props; + const {className, node, destructiveOperationsAreDisabled, canBeEdited, visibilityCanBeToggled} = this.props; const isHidden = node?.properties?._hidden; return ( @@ -53,7 +52,7 @@ export default class HideSelectedNode extends PureComponent { onClick={isHidden ? this.handleShowNode : this.handleHideNode} icon="eye-slash" hoverStyle="brand" - title={i18nRegistry.translate('hideUnhide')} + title={translate('Neos.Neos:Main:hideUnhide')} /> ); } diff --git a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/PasteClipBoardNode/index.js b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/PasteClipBoardNode/index.js index fecf882255..e4aa9e49e9 100644 --- a/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/PasteClipBoardNode/index.js +++ b/packages/neos-ui-guest-frame/src/InlineUI/NodeToolbar/Buttons/PasteClipBoardNode/index.js @@ -2,7 +2,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; import {neos} from '@neos-project/neos-ui-decorators'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; @@ -35,8 +35,7 @@ export default class PasteClipBoardNode extends PureComponent { contextPath: PropTypes.string, fusionPath: PropTypes.string, - pasteNode: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired + pasteNode: PropTypes.func.isRequired }; handlePasteButtonClick = () => { @@ -46,7 +45,7 @@ export default class PasteClipBoardNode extends PureComponent { } render() { - const {className, canBePasted, i18nRegistry} = this.props; + const {className, canBePasted} = this.props; if (!canBePasted) { return null; @@ -59,7 +58,7 @@ export default class PasteClipBoardNode extends PureComponent { icon="paste" onClick={this.handlePasteButtonClick} hoverStyle="brand" - title={i18nRegistry.translate('paste')} + title={translate('Neos.Neos:Main:paste')} /> ); } diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/AddNode/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/AddNode/index.js index 20b1ee7576..a96cb9944e 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/AddNode/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/AddNode/index.js @@ -1,6 +1,6 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; export default class AddNode extends PureComponent { @@ -9,8 +9,7 @@ export default class AddNode extends PureComponent { id: PropTypes.string, onClick: PropTypes.func.isRequired, focusedNodeContextPath: PropTypes.string, - disabled: PropTypes.bool.isRequired, - i18nRegistry: PropTypes.object.isRequired + disabled: PropTypes.bool.isRequired }; handleClick = () => { @@ -20,7 +19,7 @@ export default class AddNode extends PureComponent { } render() { - const {focusedNodeContextPath, disabled, className, id, i18nRegistry} = this.props; + const {focusedNodeContextPath, disabled, className, id} = this.props; return ( @@ -31,7 +30,7 @@ export default class AddNode extends PureComponent { icon="plus" onClick={this.handleClick} hoverStyle="brand" - title={i18nRegistry.translate('createNew')} + title={translate('Neos.Neos:Main:createNew')} /> ); diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/CopySelectedNode/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/CopySelectedNode/index.js index b04a04c272..80f50a4c40 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/CopySelectedNode/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/CopySelectedNode/index.js @@ -1,6 +1,6 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; export default class CopySelectedNode extends PureComponent { @@ -15,9 +15,7 @@ export default class CopySelectedNode extends PureComponent { disabled: PropTypes.bool, - isActive: PropTypes.bool, - - i18nRegistry: PropTypes.object.isRequired + isActive: PropTypes.bool }; handleClick = () => { @@ -31,8 +29,7 @@ export default class CopySelectedNode extends PureComponent { className, id, disabled, - isActive, - i18nRegistry + isActive } = this.props; return ( @@ -44,7 +41,7 @@ export default class CopySelectedNode extends PureComponent { onClick={this.handleClick} icon="far copy" hoverStyle="brand" - title={i18nRegistry.translate('copy')} + title={translate('Neos.Neos:Main:copy')} /> ); } diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/CutSelectedNode/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/CutSelectedNode/index.js index 42bb2345a4..1efcdc49e9 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/CutSelectedNode/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/CutSelectedNode/index.js @@ -1,6 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; +import {translate} from '@neos-project/neos-ui-i18n'; export default class CutSelectedNode extends PureComponent { static propTypes = { @@ -11,8 +12,7 @@ export default class CutSelectedNode extends PureComponent { disabled: PropTypes.bool.isRequired, isActive: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired + onClick: PropTypes.func.isRequired }; handleClick = () => { @@ -22,7 +22,7 @@ export default class CutSelectedNode extends PureComponent { } render() { - const {className, id, disabled, isActive, i18nRegistry} = this.props; + const {className, id, disabled, isActive} = this.props; return ( ); } diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/DeleteSelectedNode/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/DeleteSelectedNode/index.js index ca11c65e72..6f9c5ad20f 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/DeleteSelectedNode/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/DeleteSelectedNode/index.js @@ -1,6 +1,6 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; export default class DeleteSelectedNode extends PureComponent { @@ -11,9 +11,7 @@ export default class DeleteSelectedNode extends PureComponent { focusedNodeContextPath: PropTypes.string, disabled: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, - - i18nRegistry: PropTypes.object.isRequired + onClick: PropTypes.func.isRequired }; handleClick = () => { @@ -23,7 +21,7 @@ export default class DeleteSelectedNode extends PureComponent { } render() { - const {className, id, disabled, i18nRegistry} = this.props; + const {className, id, disabled} = this.props; return ( ); } diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/HideSelectedNode/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/HideSelectedNode/index.js index f4e45c5f49..2e7a6e119a 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/HideSelectedNode/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/HideSelectedNode/index.js @@ -1,6 +1,6 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; export default class HideSelectedNode extends PureComponent { @@ -11,12 +11,11 @@ export default class HideSelectedNode extends PureComponent { disabled: PropTypes.bool.isRequired, isHidden: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired + onClick: PropTypes.func.isRequired }; render() { - const {className, id, disabled, isHidden, i18nRegistry, onClick} = this.props; + const {className, id, disabled, isHidden, onClick} = this.props; return ( ); } diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/PasteClipBoardNode/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/PasteClipBoardNode/index.js index c97d9cb38a..5595a91ce9 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/PasteClipBoardNode/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/PasteClipBoardNode/index.js @@ -1,6 +1,6 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; - +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; export default class PasteClipBoardNode extends PureComponent { @@ -11,8 +11,7 @@ export default class PasteClipBoardNode extends PureComponent { focusedNodeContextPath: PropTypes.string, disabled: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired + onClick: PropTypes.func.isRequired }; handleClick = () => { @@ -25,8 +24,7 @@ export default class PasteClipBoardNode extends PureComponent { const { className, id, - disabled, - i18nRegistry + disabled } = this.props; return ( @@ -37,7 +35,7 @@ export default class PasteClipBoardNode extends PureComponent { icon="paste" onClick={this.handleClick} hoverStyle="brand" - title={i18nRegistry.translate('paste')} + title={translate('Neos.Neos:Main:paste')} /> ); } diff --git a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/RefreshPageTree/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/RefreshPageTree/index.js index ab5efef12b..007d9a096f 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/RefreshPageTree/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeToolBar/Buttons/RefreshPageTree/index.js @@ -1,6 +1,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import mergeClassNames from 'classnames'; +import {translate} from '@neos-project/neos-ui-i18n'; import IconButton from '@neos-project/react-ui-components/src/IconButton/'; import style from './style.module.css'; @@ -13,9 +14,7 @@ export default class RefreshPageTree extends PureComponent { isLoading: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, - - i18nRegistry: PropTypes.object.isRequired + onClick: PropTypes.func.isRequired }; handleClick = () => { @@ -25,7 +24,7 @@ export default class RefreshPageTree extends PureComponent { } render() { - const {isLoading, className, id, i18nRegistry} = this.props; + const {isLoading, className, id} = this.props; const finalClassName = mergeClassNames({ [style.spinning]: isLoading, [className]: className && className.length @@ -39,7 +38,7 @@ export default class RefreshPageTree extends PureComponent { onClick={this.handleClick} icon="sync" hoverStyle="brand" - title={i18nRegistry.translate('refresh')} + title={translate('Neos.Neos:Main:refresh')} /> ); } diff --git a/packages/neos-ui/src/Containers/Modals/DeleteNode/index.js b/packages/neos-ui/src/Containers/Modals/DeleteNode/index.js index 248724db54..d7cb2a33a4 100644 --- a/packages/neos-ui/src/Containers/Modals/DeleteNode/index.js +++ b/packages/neos-ui/src/Containers/Modals/DeleteNode/index.js @@ -6,6 +6,7 @@ import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; import {neos} from '@neos-project/neos-ui-decorators'; +import {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; @@ -51,7 +52,7 @@ export default class DeleteNodeModal extends PureComponent { const nodeType = node?.nodeType; const nodeTypeLabel = nodeTypesRegistry.get(nodeType)?.ui?.label || 'Neos.Neos:Main:node'; const nodeTypeLabelText = i18nRegistry.translate(nodeTypeLabel, 'Node') - const deleteLabel = i18nRegistry.translate('delete', 'Delete') + const deleteLabel = translate('Neos.Neos:Main:delete', 'Delete') return (
    @@ -84,7 +85,7 @@ export default class DeleteNodeModal extends PureComponent { } renderAbort() { - const abortLabel = this.props.i18nRegistry.translate('cancel', 'Cancel') + const abortLabel = translate('Neos.Neos:Main:cancel', 'Cancel') return ( ; @@ -70,7 +70,7 @@ const ReloadNeosUiButton = () => { }; return ; }; @@ -79,8 +79,8 @@ const ErrorFallback = (props: { error: any }) => { return
    -

    {translate('Neos.Neos.Ui:Main:errorBoundary.title')}

    -

    {translate('Neos.Neos.Ui:Main:errorBoundary.description')}

    +

    {translate('Neos.Neos.Ui:Main:errorBoundary.title', 'Sorry, but the Neos UI could not recover from this error.')}

    +

    {translate('Neos.Neos.Ui:Main:errorBoundary.description', 'Please reload the application, or contact your system administrator with the given details.')}

    {props.error instanceof Error && <> @@ -98,7 +98,7 @@ const ErrorFallback = (props: { error: any }) => { } -

    {translate('Neos.Neos.Ui:Main:errorBoundary.footer')}

    +

    {translate('Neos.Neos.Ui:Main:errorBoundary.footer', 'For more information about the error please refer to the JavaScript console.')}

    diff --git a/packages/neos-ui-i18n/src/translate.ts b/packages/neos-ui-i18n/src/translate.ts index 4db4870abd..acd5794a4d 100644 --- a/packages/neos-ui-i18n/src/translate.ts +++ b/packages/neos-ui-i18n/src/translate.ts @@ -57,6 +57,12 @@ function renderFallback( parameters: Parameters ) { const fallbackHasPluralForms = Array.isArray(fallback); + if (fallbackHasPluralForms ? !(typeof fallback[0] === 'string' && typeof fallback[1] === 'string') : typeof fallback !== 'string') { + // error handling for legacy codebase if the translate() call is not validated by typescript + console.error('The translation fallback must be provided in the form of: string|[string,string]. Got: ', fallback); + return ''; + } + let result: string; if (fallbackHasPluralForms) { result = quantity === 1 ? fallback[0] : fallback[1]; From 82553f1003438f38281e9371bf26e6a9d1131599 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 15:13:33 +0100 Subject: [PATCH 12/15] TASK: Jest tests by faking new translate() method correctly --- .../src/Editors/SelectBox/index.spec.js | 5 +++++ .../src/Editors/SelectBox/selectBoxHelpers.spec.ts | 13 +++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/neos-ui-editors/src/Editors/SelectBox/index.spec.js b/packages/neos-ui-editors/src/Editors/SelectBox/index.spec.js index 9118180513..fa064edf5c 100644 --- a/packages/neos-ui-editors/src/Editors/SelectBox/index.spec.js +++ b/packages/neos-ui-editors/src/Editors/SelectBox/index.spec.js @@ -6,6 +6,7 @@ import TestBackend from 'react-dnd-test-backend'; import {DndProvider as DragDropContextProvider} from 'react-dnd'; import SelectBoxEditor from './index.js'; import {WrapWithMockGlobalRegistry, MockDataSourceDataLoader} from '../../_lib/testUtils'; +import {setupI18n} from "@neos-project/neos-ui-i18n"; const optionValues = { foo: { @@ -41,6 +42,10 @@ const multiselectLabels = component => const commit = () => {}; +beforeAll(() => { + setupI18n('en-US', 'one,other', {}); +}); + test(`SelectBox > single, no dataSource, no preselected value`, () => { const expectedDropdownElementLabels = ['fooLabel', 'barLabel']; const component = mount( diff --git a/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.spec.ts b/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.spec.ts index 52fa4b2334..146762acac 100644 --- a/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.spec.ts +++ b/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.spec.ts @@ -1,10 +1,15 @@ import {processSelectBoxOptions} from './selectBoxHelpers'; import {I18nRegistry} from '@neos-project/neos-ts-interfaces'; +import {setupI18n} from "@neos-project/neos-ui-i18n"; const fakeI18NRegistry = { translate: (id) => id ?? '' } as I18nRegistry; +beforeAll(() => { + setupI18n('en-US', 'one,other', {}); +}); + describe('processSelectBoxOptions', () => { it('transforms an associative array with labels to list of objects', () => { const processOptions = processSelectBoxOptions(fakeI18NRegistry, { @@ -78,7 +83,7 @@ describe('processSelectBoxOptions', () => { 'key1': {label: 'Key 1'} }, 'oldValue'); - expect(processOptions).toEqual([{value: 'key1', label: 'Key 1'}, {value: 'oldValue', label: 'Neos.Neos.Ui:Main:invalidValue: "oldValue"', icon: 'exclamation-triangle'}]); + expect(processOptions).toEqual([{value: 'key1', label: 'Key 1'}, {value: 'oldValue', label: 'Invalid value: "oldValue"', icon: 'exclamation-triangle'}]); }); it('creates missing options for unmatched additional array value', () => { @@ -86,7 +91,7 @@ describe('processSelectBoxOptions', () => { 'key1': {label: 'Key 1'} }, ['oldValue', 'key1']); - expect(processOptions).toEqual([{value: 'key1', label: 'Key 1'}, {value: 'oldValue', label: 'Neos.Neos.Ui:Main:invalidValue: "oldValue"', icon: 'exclamation-triangle'}]); + expect(processOptions).toEqual([{value: 'key1', label: 'Key 1'}, {value: 'oldValue', label: 'Invalid value: "oldValue"', icon: 'exclamation-triangle'}]); }); it('creates missing options for unmatched additional multiple array values', () => { @@ -100,8 +105,8 @@ describe('processSelectBoxOptions', () => { {value: 'key1', label: 'Key 1'}, {value: 'key2', label: 'Key 2'}, {value: 'key3', label: 'Key 3'}, - {value: 'oldValue', label: 'Neos.Neos.Ui:Main:invalidValue: "oldValue"', icon: 'exclamation-triangle'}, - {value: 'oldValue2', label: 'Neos.Neos.Ui:Main:invalidValue: "oldValue2"', icon: 'exclamation-triangle'} + {value: 'oldValue', label: 'Invalid value: "oldValue"', icon: 'exclamation-triangle'}, + {value: 'oldValue2', label: 'Invalid value: "oldValue2"', icon: 'exclamation-triangle'} ]); }); From 08857156e6df8dd9b7063d57de5eeae2f1336e1e Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 16:25:35 +0100 Subject: [PATCH 13/15] TASK: Replace usages of with only one parameter Also appends Neos.Neos:Main if necessary, which was forgotten in: 05fe5f8e214ec42da43f3d6c46ade2c027220e95 --- .../neos-ui-containers/src/InsertModeSelector/index.js | 4 ++-- .../src/Editors/Image/Components/ResizeControls/index.js | 4 ++-- .../neos-ui-editors/src/Editors/SelectBox/index.spec.js | 2 +- .../src/Editors/SelectBox/selectBoxHelpers.spec.ts | 2 +- packages/neos-ui-validators/src/Count/index.tsx | 4 ++-- packages/neos-ui-validators/src/NumberRange/index.tsx | 4 ++-- packages/neos-ui-views/src/Data/DataLoader/index.js | 4 ++-- .../src/Containers/Modals/UnappliedChangesDialog/index.js | 8 ++++---- .../RightSideBar/Inspector/SelectedElement/index.js | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/neos-ui-containers/src/InsertModeSelector/index.js b/packages/neos-ui-containers/src/InsertModeSelector/index.js index 2fd3ad9c91..84b916c024 100644 --- a/packages/neos-ui-containers/src/InsertModeSelector/index.js +++ b/packages/neos-ui-containers/src/InsertModeSelector/index.js @@ -2,7 +2,7 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {ButtonGroup, Button, ResourceIcon} from '@neos-project/react-ui-components'; -import I18n, {translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; @@ -86,7 +86,7 @@ export default class InsertModeSelector extends PureComponent { return (
    -   + {translate('Neos.Neos:Main:insertMode')}  ); } @@ -100,7 +100,7 @@ export default class UnappliedChangesDialog extends PureComponent { onClick={this.handleResume} className={`${style.button} ${style.resumeButton}`} > - + {translate('Neos.Neos:Main:content.inspector.unappliedChangesDialog.button.default')} ); } @@ -119,7 +119,7 @@ export default class UnappliedChangesDialog extends PureComponent { className={`${style.button} ${style.publishButton}`} > - + {translate('Neos.Neos:Main:content.inspector.unappliedChangesDialog.button.success')} ); } diff --git a/packages/neos-ui/src/Containers/RightSideBar/Inspector/SelectedElement/index.js b/packages/neos-ui/src/Containers/RightSideBar/Inspector/SelectedElement/index.js index c8ad1ab808..7a7c888deb 100644 --- a/packages/neos-ui/src/Containers/RightSideBar/Inspector/SelectedElement/index.js +++ b/packages/neos-ui/src/Containers/RightSideBar/Inspector/SelectedElement/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import {connect} from 'react-redux'; import {Headline, SelectBox} from '@neos-project/react-ui-components'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {neos} from '@neos-project/neos-ui-decorators'; @@ -57,7 +57,7 @@ export default class SelectedElement extends PureComponent {
    - + {translate('Neos.Neos:Main:content.inspector.inspectorView.selectedElement')}
    From 358645969d6c2d700f15f791bd0633b6216ffe39 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Sun, 26 Jan 2025 16:44:07 +0100 Subject: [PATCH 14/15] TASK: Replace leftover usages of if possible --- .../Drawer/UserDropDown/RestoreButtonItem.js | 10 +--- .../Containers/Drawer/UserDropDown/index.js | 6 +-- .../src/Containers/Modals/InsertMode/index.js | 53 +++++-------------- .../Modals/KeyboardShortcutModal/index.js | 8 +-- .../Modals/NodeCreationDialog/index.js | 2 +- .../Modals/NodeVariantCreationDialog/index.js | 10 ++-- 6 files changed, 30 insertions(+), 59 deletions(-) diff --git a/packages/neos-ui/src/Containers/Drawer/UserDropDown/RestoreButtonItem.js b/packages/neos-ui/src/Containers/Drawer/UserDropDown/RestoreButtonItem.js index fa987c633a..80b80e9b52 100644 --- a/packages/neos-ui/src/Containers/Drawer/UserDropDown/RestoreButtonItem.js +++ b/packages/neos-ui/src/Containers/Drawer/UserDropDown/RestoreButtonItem.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import {Icon} from '@neos-project/react-ui-components'; import {connect} from 'react-redux'; import {actions} from '@neos-project/neos-ui-redux-store'; -import I18n, {translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import buttonTheme from './style.module.css'; @@ -39,13 +39,7 @@ export default class RestoreButtonItem extends React.PureComponent { aria-hidden="true" className={buttonTheme.dropDown__itemIcon} /> - + {translate('Neos.Neos:Main:impersonate.label.restoreUserButton', 'Back to user "{0}"', {0: originUser.fullName})} ) : null); diff --git a/packages/neos-ui/src/Containers/Drawer/UserDropDown/index.js b/packages/neos-ui/src/Containers/Drawer/UserDropDown/index.js index 18efa136ab..c576700985 100644 --- a/packages/neos-ui/src/Containers/Drawer/UserDropDown/index.js +++ b/packages/neos-ui/src/Containers/Drawer/UserDropDown/index.js @@ -7,7 +7,7 @@ import {Icon, DropDown} from '@neos-project/react-ui-components'; import UserImage from './UserImage'; import RestoreButtonItem from './RestoreButtonItem'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; @connect(state => ({ @@ -36,7 +36,7 @@ export default class UserDropDown extends PureComponent {
  • @@ -44,7 +44,7 @@ export default class UserDropDown extends PureComponent {
  • diff --git a/packages/neos-ui/src/Containers/Modals/InsertMode/index.js b/packages/neos-ui/src/Containers/Modals/InsertMode/index.js index 2ecf952785..f85057d592 100644 --- a/packages/neos-ui/src/Containers/Modals/InsertMode/index.js +++ b/packages/neos-ui/src/Containers/Modals/InsertMode/index.js @@ -5,7 +5,7 @@ import {connect} from 'react-redux'; import {neos} from '@neos-project/neos-ui-decorators'; import {Button, Dialog, Icon} from '@neos-project/react-ui-components'; -import I18n, {translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {InsertModeSelector} from '@neos-project/neos-ui-containers'; @@ -81,41 +81,22 @@ export default class InsertModeModal extends PureComponent { renderTitle() { const {subjectContextPaths, referenceContextPath, operationType} = this.props; - + const parameters = { + source: this.renderNodeLabel(subjectContextPaths), + target: this.renderNodeLabel([referenceContextPath]) + }; + + let label = ''; + if (operationType === actionTypes.CR.Nodes.COPY) { + label = translate('Neos.Neos:Main:copy__from__to--title', '', parameters); + } else if (operationType === actionTypes.CR.Nodes.CUT || operationType === actionTypes.CR.Nodes.MOVE) { + label = translate('Neos.Neos:Main:move__from__to--title', '', parameters); + } return (
    - {operationType === actionTypes.CR.Nodes.COPY && - - } - {operationType === actionTypes.CR.Nodes.CUT && - - } - {operationType === actionTypes.CR.Nodes.MOVE && - - } + {label}
    ); @@ -173,13 +154,7 @@ export default class InsertModeModal extends PureComponent { >

    - + {translate('Neos.Neos:Main:copy__from__to--description', '', {source: this.renderNodeLabel(subjectContextPaths), target: this.renderNodeLabel([referenceContextPath])})}

    (
    - + {translate(`Neos.Neos.Ui:Main:Shortcut__${id}`, description)}
    {keys}
    @@ -52,12 +52,12 @@ class KeyboardShortcutModal extends PureComponent { return ( } + title="Keyboard Shortcuts" isOpen={isOpen} onRequestClose={() => close()} >
    - + {translate('Neos.Neos.Ui:Main:Shortcut__Introduction')}
    {hotkeyRegistry.getAllAsList().map(key => this.renderShortcut(key))} diff --git a/packages/neos-ui/src/Containers/Modals/NodeCreationDialog/index.js b/packages/neos-ui/src/Containers/Modals/NodeCreationDialog/index.js index 514ba359ab..7f266041ea 100644 --- a/packages/neos-ui/src/Containers/Modals/NodeCreationDialog/index.js +++ b/packages/neos-ui/src/Containers/Modals/NodeCreationDialog/index.js @@ -220,7 +220,7 @@ export default class NodeCreationDialog extends PureComponent { return ( -   + {translate('Neos.Neos:Main:createNew', 'Create new')}  ); diff --git a/packages/neos-ui/src/Containers/Modals/NodeVariantCreationDialog/index.js b/packages/neos-ui/src/Containers/Modals/NodeVariantCreationDialog/index.js index d577cae831..3ade0e2dc4 100644 --- a/packages/neos-ui/src/Containers/Modals/NodeVariantCreationDialog/index.js +++ b/packages/neos-ui/src/Containers/Modals/NodeVariantCreationDialog/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import {connect} from 'react-redux'; import {Button, Dialog} from '@neos-project/react-ui-components'; -import I18n, {translate} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {selectors, actions} from '@neos-project/neos-ui-redux-store'; import {neos} from '@neos-project/neos-ui-decorators'; @@ -147,14 +147,16 @@ export default class NodeVariantCreationDialog extends PureComponent { >
    - + {translate('Neos.Neos:Main:content.dimension.createDialog.nodeTypeDoesNotExistInDimension', '', i18nParams)}
    - + {translate('Neos.Neos:Main:content.dimension.createDialog.createEmptyOrCopy', '', i18nParams)}
    {numberOfParentNodesToBeCreated > 0 ? -
    : null +
    + {translate('Neos.Neos:Main:content.dimension.createDialog.existingAncestorDocuments', '', {numberOfNodesMissingInRootline: numberOfParentNodesToBeCreated})} +
    : null }
    From 77e52c2e0e9226d42461011ec89e0afa85a28386 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:35:16 +0100 Subject: [PATCH 15/15] TASK: Fix jest test and fix `PublishDropDown` neos prop --- packages/neos-ui-validators/src/Count/index.spec.js | 5 +++++ packages/neos-ui-validators/src/NumberRange/index.spec.js | 5 +++++ .../src/Containers/PrimaryToolbar/PublishDropDown/index.js | 2 ++ 3 files changed, 12 insertions(+) diff --git a/packages/neos-ui-validators/src/Count/index.spec.js b/packages/neos-ui-validators/src/Count/index.spec.js index a6758dcef9..4e87a02df3 100644 --- a/packages/neos-ui-validators/src/Count/index.spec.js +++ b/packages/neos-ui-validators/src/Count/index.spec.js @@ -1,4 +1,9 @@ import countValidator from './index'; +import {setupI18n} from "@neos-project/neos-ui-i18n"; + +beforeAll(() => { + setupI18n('en-US', 'one,other', {}); +}); test('2 element object should be valid for min:0 max: 10', () => { const validatorOptions = { diff --git a/packages/neos-ui-validators/src/NumberRange/index.spec.js b/packages/neos-ui-validators/src/NumberRange/index.spec.js index 0edb94646d..1b1c5cb0bd 100644 --- a/packages/neos-ui-validators/src/NumberRange/index.spec.js +++ b/packages/neos-ui-validators/src/NumberRange/index.spec.js @@ -1,4 +1,9 @@ import numberRangeValidator from './index'; +import {setupI18n} from "@neos-project/neos-ui-i18n"; + +beforeAll(() => { + setupI18n('en-US', 'one,other', {}); +}); test('0 for min: 0 max: 10 should be valid', () => { const validatorOptions = { diff --git a/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js b/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js index 2da367cc23..bc9245d28f 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/PublishDropDown/index.js @@ -9,6 +9,7 @@ import {Badge, Icon, DropDown} from '@neos-project/react-ui-components'; import {translate} from '@neos-project/neos-ui-i18n'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {PublishingMode, PublishingScope} from '@neos-project/neos-ui-redux-store/src/CR/Publishing'; +import {neos} from '@neos-project/neos-ui-decorators'; const {publishableNodesSelector, publishableNodesInDocumentSelector, baseWorkspaceSelector, isWorkspaceReadOnlySelector, personalWorkspaceNameSelector} = selectors.CR.Workspaces; @@ -16,6 +17,7 @@ import AbstractButton from './AbstractButton/index'; import WorkspaceSelector from './WorkspaceSelector/index'; import style from './style.module.css'; +@neos() @connect(state => ({ isSaving: state?.ui?.remote?.isSaving, isPublishing: state?.cr?.publishing?.mode === PublishingMode.PUBLISH,