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 (
{ 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; @@ -92,7 +86,7 @@ export default class InsertModeSelector extends PureComponent { return (
-   + {translate('Neos.Neos:Main:insertMode')} 
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/DateTime/index.js b/packages/neos-ui-editors/src/Editors/DateTime/index.js index 97debf0848..33b69a470e 100644 --- a/packages/neos-ui-editors/src/Editors/DateTime/index.js +++ b/packages/neos-ui-editors/src/Editors/DateTime/index.js @@ -5,6 +5,7 @@ import moment from 'moment'; import {neos} from '@neos-project/neos-ui-decorators'; import convertPhpDateFormatToMoment, {has24HourFormat, hasDateFormat, hasTimeFormat} from './helpers'; import {connect} from 'react-redux'; +import {translate} from '@neos-project/neos-ui-i18n'; @neos(globalRegistry => ({ i18nRegistry: globalRegistry.get('i18n') @@ -61,7 +62,7 @@ class DateTime extends PureComponent { timeOnly={!hasDateFormat(options.format)} is24Hour={hasTimeFormat(options.format) && has24HourFormat(options.format)} placeholder={i18nRegistry.translate(options?.placeholder || 'Neos.Neos:Main:content.inspector.editors.dateTimeEditor.noDateSet')} - todayLabel={i18nRegistry.translate('content.inspector.editors.dateTimeEditor.today', 'Today', {}, 'Neos.Neos', 'Main')} + todayLabel={translate('Neos.Neos:Main:content.inspector.editors.dateTimeEditor.today', 'Today')} locale={interfaceLanguage} disabled={options.disabled} timeConstraints={timeConstraints} 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/Image/Components/ResizeControls/index.js b/packages/neos-ui-editors/src/Editors/Image/Components/ResizeControls/index.js index 2a9160ac61..0250a9e86f 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('Neos.Neos:Main:width', 'Width')}:
{
-
:
+
{translate('Neos.Neos:Main:height', 'Height')}:
{ - 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..f78f97692a 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, @@ -136,7 +137,7 @@ export default class DataSourceBasedSelectBoxEditor extends PureComponent { // Placeholder text must be unescaped in case html entities were used const placeholder = options && options.placeholder && i18nRegistry.translate(unescape(options.placeholder)); - const loadingLabel = i18nRegistry.translate('loading', 'Loading', [], 'Neos.Neos', 'Main'); + const loadingLabel = translate('Neos.Neos:Main:loading', 'Loading'); if (options.multiple) { return (); @@ -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/index.spec.js b/packages/neos-ui-editors/src/Editors/SelectBox/index.spec.js index 9118180513..ba03872962 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..0852956b36 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'} ]); }); diff --git a/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.ts b/packages/neos-ui-editors/src/Editors/SelectBox/selectBoxHelpers.ts index cff8a01dbe..b6d4a944e8 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', 'Invalid value')}: "${singleValue}"`, icon: 'exclamation-triangle' }); } diff --git a/packages/neos-ui-editors/src/Editors/UriPathSegment/index.js b/packages/neos-ui-editors/src/Editors/UriPathSegment/index.js index d7fe7646c3..1ac8e84681 100644 --- a/packages/neos-ui-editors/src/Editors/UriPathSegment/index.js +++ b/packages/neos-ui-editors/src/Editors/UriPathSegment/index.js @@ -7,6 +7,7 @@ import {neos} from '@neos-project/neos-ui-decorators'; import {selectors} from '@neos-project/neos-ui-redux-store'; import {TextInput, IconButton} from '@neos-project/react-ui-components'; import style from './style.module.css'; +import {translate} from '@neos-project/neos-ui-i18n'; const defaultOptions = { autoFocus: false, @@ -117,9 +118,7 @@ export default class UriPathSegment extends PureComponent { disabled={this.state.isBusy} style="neutral" hoverStyle="clean" - title={i18nRegistry.translate( - 'Neos.Neos.Ui:Main:syncUriPathSegment' - )} + title={translate('Neos.Neos.Ui:Main:syncUriPathSegment')} />
) : null} 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', '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 && <> @@ -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', 'For more information about the error please refer to the JavaScript console.')}

- - + +
; diff --git a/packages/neos-ui-error/src/container/ErrorView/ErrorView.tsx b/packages/neos-ui-error/src/container/ErrorView/ErrorView.tsx index 99243c3507..96f69ad77c 100644 --- a/packages/neos-ui-error/src/container/ErrorView/ErrorView.tsx +++ b/packages/neos-ui-error/src/container/ErrorView/ErrorView.tsx @@ -9,7 +9,7 @@ */ import React from 'react'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {AnyError, isECMAScriptError, isServerSideError, isStringError} from '../../types'; @@ -18,7 +18,7 @@ import style from './style.module.css'; export const ErrorView: React.FC<{ error: null | AnyError }> = (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-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-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]; diff --git a/packages/neos-ui-sagas/src/UI/Impersonate/index.js b/packages/neos-ui-sagas/src/UI/Impersonate/index.js index fd819bc6e6..aa95dee050 100644 --- a/packages/neos-ui-sagas/src/UI/Impersonate/index.js +++ b/packages/neos-ui-sagas/src/UI/Impersonate/index.js @@ -3,19 +3,13 @@ import {call, takeEvery} from 'redux-saga/effects'; import {actionTypes} from '@neos-project/neos-ui-redux-store'; import backend from '@neos-project/neos-ui-backend-connector'; import {showFlashMessage} from '@neos-project/neos-ui-error'; +import {translate} from '@neos-project/neos-ui-i18n'; -export function * impersonateRestore({globalRegistry, routes}) { +export function * impersonateRestore({routes}) { const {impersonateRestore} = backend.get().endpoints; - const i18nRegistry = globalRegistry.get('i18n'); yield takeEvery(actionTypes.User.Impersonate.RESTORE, function * restore(action) { - const errorMessage = i18nRegistry.translate( - 'impersonate.error.restoreUser', - 'Could not switch back to the original user.', - {}, - 'Neos.Neos', - 'Main' - ); + const errorMessage = translate('Neos.Neos:Main:impersonate.error.restoreUser', 'Could not switch back to the original user.'); try { const feedback = yield call(impersonateRestore, action.payload); @@ -23,16 +17,7 @@ export function * impersonateRestore({globalRegistry, routes}) { const user = feedback?.impersonate?.accountIdentifier; const status = feedback?.status; - const restoreMessage = i18nRegistry.translate( - 'impersonate.success.restoreUser', - 'Switched back from {0} to the orginal user {1}.', - { - 0: user, - 1: originUser - }, - 'Neos.Neos', - 'Main' - ); + const restoreMessage = translate('Neos.Neos:Main:impersonate.success.restoreUser', 'Switched back from {0} to the orginal user {1}.', {0: user, 1: originUser}); if (status) { showFlashMessage({ 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/Count/index.tsx b/packages/neos-ui-validators/src/Count/index.tsx index 35f6960349..9715a6c5af 100644 --- a/packages/neos-ui-validators/src/Count/index.tsx +++ b/packages/neos-ui-validators/src/Count/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import logger from '@neos-project/utils-logger'; /** @@ -28,7 +28,7 @@ const Count = (value: any, validatorOptions: CountOptions) => { } if (typeof value !== 'object' || value === null) { - return ; + return translate('Neos.Neos:Main:content.inspector.validators.countValidator.notCountable', ''); } const {length} = Object.keys(value); 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-validators/src/NumberRange/index.tsx b/packages/neos-ui-validators/src/NumberRange/index.tsx index e0cf204ce4..41952977c7 100644 --- a/packages/neos-ui-validators/src/NumberRange/index.tsx +++ b/packages/neos-ui-validators/src/NumberRange/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import I18n from '@neos-project/neos-ui-i18n'; +import I18n, {translate} from '@neos-project/neos-ui-i18n'; import logger from '@neos-project/utils-logger'; /** @@ -33,7 +33,7 @@ const NumberRange = (value: any, validatorOptions: NumberRangeOptions) => { } if (value.length > 0 && !Number.isSafeInteger(number)) { - return ; + return translate('Neos.Neos:Main:content.inspector.validators.numberRangeValidator.validNumberExpected', ''); } if (number < minimum || number > maximum) { const label = validatorOptions?.validationErrorMessage ?? 'content.inspector.validators.numberRangeValidator.numberShouldBeInRange'; diff --git a/packages/neos-ui-views/src/Data/DataLoader/index.js b/packages/neos-ui-views/src/Data/DataLoader/index.js index 5dde983736..048ec06338 100644 --- a/packages/neos-ui-views/src/Data/DataLoader/index.js +++ b/packages/neos-ui-views/src/Data/DataLoader/index.js @@ -5,9 +5,9 @@ import {neos} from '@neos-project/neos-ui-decorators'; import {selectors} from '@neos-project/neos-ui-redux-store'; import Widget from '../../Widget/index'; import Icon from '@neos-project/react-ui-components/src/Icon/'; -import I18n from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; import isEqual from 'lodash.isequal'; +import {translate} from '@neos-project/neos-ui-i18n'; /* * This HOC is responsible for fetching data for Data views and wraping @@ -91,7 +91,7 @@ export default () => WrappedComponent => { } if (!this.state.data) { - return (
); + return (
{translate('Neos.Neos:Main:loading')}
); } return (); diff --git a/packages/neos-ui-views/src/NodeInfoView/index.js b/packages/neos-ui-views/src/NodeInfoView/index.js index e82d6a2baa..4e7b7b347b 100644 --- a/packages/neos-ui-views/src/NodeInfoView/index.js +++ b/packages/neos-ui-views/src/NodeInfoView/index.js @@ -1,25 +1,20 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; -import {neos} from '@neos-project/neos-ui-decorators'; import {selectors} from '@neos-project/neos-ui-redux-store'; import {IconButton} from '@neos-project/react-ui-components'; import style from './style.module.css'; +import {translate} from '@neos-project/neos-ui-i18n'; @connect(state => ({ focusedNodeContextPath: selectors.CR.Nodes.focusedNodePathSelector(state), getNodeByContextPath: selectors.CR.Nodes.nodeByContextPath(state) })) -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) export default class NodeInfoView extends PureComponent { static propTypes = { commit: PropTypes.func.isRequired, focusedNodeContextPath: PropTypes.string, - getNodeByContextPath: PropTypes.func.isRequired, - - i18nRegistry: PropTypes.object.isRequired + getNodeByContextPath: PropTypes.func.isRequired } nodeTypeNameRef = React.createRef(); @@ -36,7 +31,7 @@ export default class NodeInfoView extends PureComponent { } render() { - const {focusedNodeContextPath, getNodeByContextPath, i18nRegistry} = this.props; + const {focusedNodeContextPath, getNodeByContextPath} = this.props; const node = getNodeByContextPath(focusedNodeContextPath); const properties = { @@ -55,32 +50,32 @@ export default class NodeInfoView extends PureComponent { return (
  • -
    {i18nRegistry.translate('created', 'Created', {}, 'Neos.Neos')}
    +
    {translate('Neos.Neos:Main:created', 'Created')}
    {new Date(properties.created).toLocaleString()}
  • -
    {i18nRegistry.translate('lastModification', 'Last modification', {}, 'Neos.Neos')}
    - {properties.lastModification ? new Date(properties.lastModification).toLocaleString() : i18nRegistry.translate('unavailable', 'unavailable', {}, 'Neos.Neos')} +
    {translate('Neos.Neos:Main:lastModification', 'Last modification')}
    + {properties.lastModification ? new Date(properties.lastModification).toLocaleString() : translate('Neos.Neos:Main:unavailable', 'unavailable')}
  • -
    {i18nRegistry.translate('lastPublication', 'Last publication', {}, 'Neos.Neos')}
    - {properties.lastPublication ? new Date(properties.lastPublication).toLocaleString() : i18nRegistry.translate('unavailable', 'unavailable', {}, 'Neos.Neos')} +
    {translate('Neos.Neos:Main:lastPublication', 'Last publication')}
    + {properties.lastPublication ? new Date(properties.lastPublication).toLocaleString() : translate('Neos.Neos:Main:unavailable', 'unavailable')}
  • -
    {i18nRegistry.translate('identifier', 'Identifier', {}, 'Neos.Neos')}
    +
    {translate('Neos.Neos:Main:identifier', 'Identifier')}
    {properties.identifier}
  • -
    {i18nRegistry.translate('nodeAddress', 'Node Address', {}, 'Neos.Neos')}
    +
    {translate('Neos.Neos:Main:nodeAddress', 'Node Address')}
    {properties.nodeAddress}
  • -
    {i18nRegistry.translate('name', 'Name', {}, 'Neos.Neos')}
    - {properties.name ?? i18nRegistry.translate('unavailable', 'unavailable', {}, 'Neos.Neos')} +
    {translate('Neos.Neos:Main:name', 'Name')}
    + {properties.name ?? translate('Neos.Neos:Main:unavailable', 'unavailable')}
  • {i18nRegistry.translate('type', 'Type', {}, 'Neos.Neos')}
    + className={style.nodeInfoView__title}>{translate('Neos.Neos:Main:type', 'Type')}
@@ -88,7 +83,7 @@ export default class NodeInfoView extends PureComponent { diff --git a/packages/neos-ui/src/Containers/Drawer/UserDropDown/RestoreButtonItem.js b/packages/neos-ui/src/Containers/Drawer/UserDropDown/RestoreButtonItem.js index e4fc5840ba..80b80e9b52 100644 --- a/packages/neos-ui/src/Containers/Drawer/UserDropDown/RestoreButtonItem.js +++ b/packages/neos-ui/src/Containers/Drawer/UserDropDown/RestoreButtonItem.js @@ -2,10 +2,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import {Icon} from '@neos-project/react-ui-components'; -import {neos} from '@neos-project/neos-ui-decorators'; import {connect} from 'react-redux'; import {actions} from '@neos-project/neos-ui-redux-store'; -import I18n from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import buttonTheme from './style.module.css'; @@ -17,25 +16,15 @@ import buttonTheme from './style.module.css'; impersonateRestore: actions.User.Impersonate.restore } ) -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) export default class RestoreButtonItem extends React.PureComponent { static propTypes = { originUser: PropTypes.object, - impersonateRestore: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired + impersonateRestore: PropTypes.func.isRequired }; render() { - const {originUser, i18nRegistry, impersonateRestore} = this.props; - const title = i18nRegistry.translate( - 'impersonate.title.restoreUserButton', - 'Switch back to the orginal user account', - {}, - 'Neos.Neos', - 'Main' - ); + const {originUser, impersonateRestore} = this.props; + const title = translate('Neos.Neos:Main:impersonate.title.restoreUserButton', 'Switch back to the orginal user account',); return (originUser ? (
  • @@ -50,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/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..3836cdd143 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'; @@ -32,7 +33,7 @@ export default class NodeTreeFilter extends PureComponent { render() { const {i18nRegistry, nodeTypesRegistry, neos, onChange, value} = this.props; - const label = i18nRegistry.translate('filter', 'Filter', {}, 'Neos.Neos', 'Main'); + const label = translate('Neos.Neos:Main:filter', 'Filter'); const presets = neos?.configuration?.nodeTree?.presets; let options = Object.keys(presets) @@ -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/NodeTreeSearchBar/index.js b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeSearchBar/index.js index e889e701cb..aa1dd02c72 100644 --- a/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeSearchBar/index.js +++ b/packages/neos-ui/src/Containers/LeftSideBar/NodeTreeSearchBar/index.js @@ -4,7 +4,7 @@ import {connect} from 'react-redux'; import debounce from 'lodash.debounce'; import mergeClassNames from 'classnames'; -import {neos} from '@neos-project/neos-ui-decorators'; +import {translate} from '@neos-project/neos-ui-i18n'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {IconButton} from '@neos-project/react-ui-components'; @@ -14,10 +14,6 @@ import style from './style.module.css'; const searchDelay = 300; -@neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -})) - @connect(state => ({ isSearchBarVisible: state?.ui?.leftSideBar?.searchBar?.isVisible }), { @@ -26,7 +22,6 @@ const searchDelay = 300; class NodeTreeSearchBar extends PureComponent { static propTypes = { - i18nRegistry: PropTypes.object.isRequired, rootNode: PropTypes.object, commenceSearch: PropTypes.func.isRequired, isSearchBarVisible: PropTypes.bool.isRequired, @@ -83,9 +78,9 @@ class NodeTreeSearchBar extends PureComponent { } render() { - const {i18nRegistry, isSearchBarVisible} = this.props; + const {isSearchBarVisible} = this.props; const {searchValue, searchFocused, filterNodeType} = this.state; - const searchLabel = i18nRegistry.translate('search', 'Search', {}, 'Neos.Neos', 'Main'); + const searchLabel = translate('Neos.Neos:Main:search', 'Search'); const searchToggleClassName = mergeClassNames({ [style.searchToggleButton]: true, 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/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')}
    @@ -66,13 +67,7 @@ export default class DeleteNodeModal extends PureComponent { ); } - const deleteMultipleNodesLabel = i18nRegistry.translate( - 'deleteXNodes', - 'Delete multiple nodes', - {amount: nodesToBeDeletedContextPaths.length}, - 'Neos.Neos.Ui', - 'Main' - ) + const deleteMultipleNodesLabel = translate('Neos.Neos.Ui:Main:deleteXNodes', 'Delete multiple nodes', {amount: nodesToBeDeletedContextPaths.length}) return (
    @@ -84,7 +79,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 ( ); } @@ -145,7 +126,7 @@ export default class InsertModeModal extends PureComponent { onClick={this.handleApply} className={style.applyBtn} > - + {translate('Neos.Neos:Main:apply', 'Apply')} ); } @@ -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}
    @@ -41,7 +41,7 @@ class KeyboardShortcutModal extends PureComponent { hoverStyle="brand" onClick={() => this.props.close()} > - + {translate('Neos.Neos:Main:close', 'Close')} ); } @@ -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 3724de38bb..7f266041ea 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')} ); } @@ -220,7 +220,7 @@ export default class NodeCreationDialog extends PureComponent { return ( -   + {translate('Neos.Neos:Main:createNew', 'Create new')}  ); @@ -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..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 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'; @@ -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')} ); } @@ -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 }
    diff --git a/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/PublishingDialog/ConfirmationDialog.tsx index 49e3e3e03b..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 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'; @@ -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', @@ -193,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={
    - + {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..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 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'; @@ -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', @@ -284,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={
    - + {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/ReloginDialog/index.js b/packages/neos-ui/src/Containers/Modals/ReloginDialog/index.js index f5bf7e783c..2f58e4fd91 100644 --- a/packages/neos-ui/src/Containers/Modals/ReloginDialog/index.js +++ b/packages/neos-ui/src/Containers/Modals/ReloginDialog/index.js @@ -2,18 +2,14 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; -import {neos} from '@neos-project/neos-ui-decorators'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; 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 => ({ - 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; @@ -69,7 +64,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" @@ -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} /> @@ -103,9 +98,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..b42cbee4c3 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')} ); } @@ -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/Modals/SelectNodeType/nodeTypeFilter.js b/packages/neos-ui/src/Containers/Modals/SelectNodeType/nodeTypeFilter.js index 56af0dfd16..62e119813d 100644 --- a/packages/neos-ui/src/Containers/Modals/SelectNodeType/nodeTypeFilter.js +++ b/packages/neos-ui/src/Containers/Modals/SelectNodeType/nodeTypeFilter.js @@ -1,10 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import {TextInput, IconButton, Icon} from '@neos-project/react-ui-components'; -import {neos} from '@neos-project/neos-ui-decorators'; +import {translate} from '@neos-project/neos-ui-i18n'; import style from './style.module.css'; -const NodeTypeFilter = ({onChange, onEnterKey, filterSearchTerm, i18nRegistry}) => { +const NodeTypeFilter = ({onChange, onEnterKey, filterSearchTerm}) => { const handleResetFilter = () => { onChange(''); }; @@ -17,7 +17,7 @@ const NodeTypeFilter = ({onChange, onEnterKey, filterSearchTerm, i18nRegistry}) onEnterKey(); }; - const label = i18nRegistry.translate('filter', 'Filter', {}, 'Neos.Neos', 'Main'); + const label = translate('Neos.Neos:Main:filter', 'Filter'); return (
    @@ -47,10 +47,7 @@ const NodeTypeFilter = ({onChange, onEnterKey, filterSearchTerm, i18nRegistry}) NodeTypeFilter.propTypes = { onChange: PropTypes.func.isRequired, onEnterKey: PropTypes.func.isRequired, - filterSearchTerm: PropTypes.string, - i18nRegistry: PropTypes.object.isRequired + filterSearchTerm: PropTypes.string }; -export default neos(globalRegistry => ({ - i18nRegistry: globalRegistry.get('i18n') -}))(NodeTypeFilter); +export default NodeTypeFilter; diff --git a/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConfirmationDialog.tsx index 36ec8a8f8d..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 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'; @@ -35,10 +35,7 @@ export const ConfirmationDialog: React.FC<{ hoverStyle="brand" onClick={props.onCancel} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:confirmation.cancel', 'No, cancel')} , ]} title={
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:confirmation.title', 'Synchronize workspace "{workspaceName}" with "{baseWorkspaceName}"', props as any)}
    } onRequestClose={props.onCancel} @@ -78,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/ConflictList.tsx b/packages/neos-ui/src/Containers/Modals/SyncWorkspaceDialog/ConflictList.tsx index e473d7c685..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 I18n, {I18nRegistry} 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 ( @@ -38,32 +36,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,15 +67,13 @@ 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; const ConflictItem: React.FC<{ conflict: Conflict; - i18n: I18nRegistry; }> = (props) => { const changeVariant = props.conflict.typeOfChange === null ? null @@ -91,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 ( @@ -126,10 +109,7 @@ const ConflictItem: React.FC<{
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.affectedSite.label', 'Affected Site')}
    @@ -137,10 +117,7 @@ const ConflictItem: React.FC<{
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.affectedDocument.label', 'Affected Document')}
    @@ -148,10 +125,7 @@ const ConflictItem: React.FC<{
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.typeOfChange.label', 'What was changed?')}
    {changeVariant ? (
    @@ -159,52 +133,27 @@ const ConflictItem: React.FC<{ className={style.conflict__changeIcon} icon={changeVariant.icon} /> - + {translate(changeVariant.label.id, changeVariant.label.fallback, {label: affectedNode.label})}
    ) : (
    - + {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 ? (
    - + {translate(reasonVariant.label.id, reasonVariant.label.fallback, {label: affectedNode.label})}
    ) : (
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:conflictList.reasonForConflict.unknownMessage', 'Sorry, but there is no available information on the reason for this conflict.')}
    )}
    @@ -230,11 +179,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/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 43923d4b52..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 I18n, {I18nRegistry} 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) => { @@ -58,10 +56,7 @@ const ForceConfirmationDialog: React.FC<{ hoverStyle="brand" onClick={props.onCancelConflictResolution} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.FORCE.confirmation.cancel', 'No, cancel')} , ]} title={
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.FORCE.confirmation.title', 'Drop conflicting changes in workspace "{workspaceName}"', props as any)}
    } onRequestClose={props.onCancelConflictResolution} @@ -96,18 +84,11 @@ 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 +110,7 @@ const DiscardAllConfirmationDialog: React.FC<{ hoverStyle="brand" onClick={props.onCancelConflictResolution} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.DISCARD_ALL.confirmation.cancel', 'No, cancel')} , ]} title={
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.DISCARD_ALL.confirmation.title', 'Discard all changes in workspace "{workspaceName}"', props as any)}
    } onRequestClose={props.onCancelConflictResolution} @@ -173,11 +144,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 6c46c83095..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 I18n, {I18nRegistry} 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'; @@ -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', @@ -64,7 +63,6 @@ export const ResolutionStrategySelectionDialog: React.FC<{ baseWorkspaceName: WorkspaceName; conflicts: Conflict[]; defaultStrategy: null | ResolutionStrategy; - i18n: I18nRegistry; onCancel: () => void; onSelectResolutionStrategy: (strategy: ResolutionStrategy) => void; }> = (props) => { @@ -83,18 +81,18 @@ 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 ) }; }) - }, [props.i18n, props.workspaceName]); + }, [props.workspaceName]); const handleSelectResolutionStrategy = React.useCallback((value: string) => { setSelectedResolutionStrategy(parseInt(value, 10)); }, []); @@ -112,10 +110,7 @@ export const ResolutionStrategySelectionDialog: React.FC<{ hoverStyle="brand" onClick={props.onCancel} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.cancel', 'Cancel Synchronization')} , ]} title={
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.title', 'Conflicts between workspace "{workspaceName}" and "{baseWorkspaceName}"', props as any)}
    } onRequestClose={props.onCancel} @@ -155,28 +143,16 @@ 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})}
    - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:resolutionStrategy.selection.prompt', 'In order to proceed, you need to decide what to do with the conflicting changes:')} - `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}".' } } } @@ -81,10 +76,7 @@ export const ResultDialog: React.FC<{ onClick={props.onAcknowledge} className={style.button} > - + {translate('Neos.Neos.Ui:SyncWorkspaceDialog:error.acknowledge', 'Cancel')} , ] : [ ]} title={
    - + {translate(variant.label.title.id, variant.label.title.fallback, props as any)}
    } onRequestClose={props.onAcknowledge} @@ -142,13 +124,7 @@ export const ResultDialog: React.FC<{ /> {props.result.phase === SyncingPhase.ERROR ? () - : ( - - ) + : translate(variant.label.message.id, variant.label.message.fallback, props as any) } 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); diff --git a/packages/neos-ui/src/Containers/Modals/UnappliedChangesDialog/index.js b/packages/neos-ui/src/Containers/Modals/UnappliedChangesDialog/index.js index 7fb8f3e470..bffd9b0b19 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 {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?')}
    @@ -88,7 +85,7 @@ export default class UnappliedChangesDialog extends PureComponent { className={`${style.button} ${style.discardButton}`} > - + {translate('Neos.Neos:Main:content.inspector.unappliedChangesDialog.button.danger')} ); } @@ -103,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')} ); } @@ -122,7 +119,7 @@ export default class UnappliedChangesDialog extends PureComponent { className={`${style.button} ${style.publishButton}`} > - + {translate('Neos.Neos:Main:content.inspector.unappliedChangesDialog.button.success')} ); } @@ -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/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/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/EditPreviewDropDown/index.js b/packages/neos-ui/src/Containers/PrimaryToolbar/EditPreviewDropDown/index.js index 038b2685c0..e174e38924 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/EditPreviewDropDown/index.js +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/EditPreviewDropDown/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import {connect} from 'react-redux'; 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'; import {actions, selectors} from '@neos-project/neos-ui-redux-store/src'; @@ -16,14 +16,12 @@ import {Icon, DropDown, Button} from '@neos-project/react-ui-components'; setEditPreviewMode: actions.UI.EditPreviewMode.set }) @neos(globalRegistry => ({ - editPreviewModes: globalRegistry.get('frontendConfiguration').get('editPreviewModes'), - i18nRegistry: globalRegistry.get('i18n') + editPreviewModes: globalRegistry.get('frontendConfiguration').get('editPreviewModes') })) export default class EditPreviewModeDropDown extends PureComponent { static propTypes = { editPreviewMode: PropTypes.string.isRequired, setEditPreviewMode: PropTypes.func.isRequired, - i18nRegistry: PropTypes.object.isRequired, editPreviewModes: PropTypes.object.isRequired }; @@ -45,8 +43,7 @@ export default class EditPreviewModeDropDown extends PureComponent { render() { const { editPreviewMode, - editPreviewModes, - i18nRegistry + editPreviewModes } = this.props; const currentEditMode = editPreviewModes[editPreviewMode] || Object.values(editPreviewModes)[0]; @@ -71,7 +68,7 @@ export default class EditPreviewModeDropDown extends PureComponent {
    - {i18nRegistry.translate('content.components.editPreviewPanel.modes', 'Editing Modes')} + {translate('Neos.Neos:Main:content.components.editPreviewPanel.modes', 'Editing Modes')}
      {editingModes.map(editingMode => ( @@ -89,7 +86,7 @@ export default class EditPreviewModeDropDown extends PureComponent { {previewModes.length > 0 && ( <>
      - {i18nRegistry.translate('content.components.editPreviewPanel.previewCentral', 'Preview Central')} + {translate('Neos.Neos:Main:content.components.editPreviewPanel.previewCentral', 'Preview Central')}
        {previewModes.map(previewMode => ( 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 cccae81dda..bc9245d28f 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'; @@ -17,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, @@ -29,10 +30,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 +42,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 +74,6 @@ export default class PublishDropDown extends PureComponent { isWorkspaceReadOnly, baseWorkspace, changeBaseWorkspaceAction, - i18nRegistry, neos } = this.props; @@ -118,12 +113,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')} /> ) : ( )} - + {translate('Neos.Neos:Main:publishAll', 'Publish All')} {publishableNodesCount > 0 && } @@ -163,7 +158,7 @@ export default class PublishDropDown extends PureComponent {
        - + {translate('Neos.Neos:Main:discard', 'Discard')} {publishableNodesInDocumentCount > 0 && } @@ -177,7 +172,7 @@ export default class PublishDropDown extends PureComponent {
        - + {translate('Neos.Neos:Main:discardAll', 'Discard All')} {publishableNodesCount > 0 && } @@ -186,7 +181,7 @@ export default class PublishDropDown extends PureComponent {
        - + {translate('Neos.Neos:Main:reviewChanges', 'Review changes')} )}
      • @@ -194,7 +189,7 @@ export default class PublishDropDown extends PureComponent {
        - + {translate('Neos.Neos:Main:workspaces', 'Workspaces')}
      • diff --git a/packages/neos-ui/src/Containers/PrimaryToolbar/WorkspaceSync/WorkspaceSync.tsx b/packages/neos-ui/src/Containers/PrimaryToolbar/WorkspaceSync/WorkspaceSync.tsx index a618709358..fe8f29aa96 100644 --- a/packages/neos-ui/src/Containers/PrimaryToolbar/WorkspaceSync/WorkspaceSync.tsx +++ b/packages/neos-ui/src/Containers/PrimaryToolbar/WorkspaceSync/WorkspaceSync.tsx @@ -13,9 +13,8 @@ import {connect} from 'react-redux'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {GlobalState} from '@neos-project/neos-ui-redux-store/src/System'; -import {neos} from '@neos-project/neos-ui-decorators'; import {WorkspaceStatus} from '@neos-project/neos-ts-interfaces'; -import type {I18nRegistry} from '@neos-project/neos-ui-i18n'; +import {translate} from '@neos-project/neos-ui-i18n'; import {Button} from '@neos-project/react-ui-components'; import {WorkspaceSyncIcon} from './WorkspaceSyncIcon'; @@ -36,17 +35,8 @@ const withReduxState = connect((state: GlobalState): WorkspaceSyncPropsFromRedux startSyncing: actions.CR.Syncing.start }); -type WorkspaceSyncPropsFromNeosGlobals = { - i18nRegistry: I18nRegistry; -}; - -const withNeosGlobals = neos((globalRegistry): WorkspaceSyncPropsFromNeosGlobals => ({ - i18nRegistry: globalRegistry.get('i18n') -})); - type WorkspaceSyncProps = & WorkspaceSyncPropsFromReduxState - & WorkspaceSyncPropsFromNeosGlobals & WorkspaceSyncHandlers; const WorkspaceSync: React.FC = (props) => { @@ -58,9 +48,7 @@ const WorkspaceSync: React.FC = (props) => { return null; } - const buttonTitle = props.i18nRegistry.translate( - 'syncPersonalWorkSpace', - 'Synchronize personal workspace', {}, 'Neos.Neos.Ui', 'Main'); + const buttonTitle = translate('Neos.Neos.Ui:Main:syncPersonalWorkSpace', 'Synchronize personal workspace'); return (
        { diff --git a/packages/neos-ui/src/Containers/RightSideBar/index.js b/packages/neos-ui/src/Containers/RightSideBar/index.js index 656aff9ad3..a0723a6dc2 100644 --- a/packages/neos-ui/src/Containers/RightSideBar/index.js +++ b/packages/neos-ui/src/Containers/RightSideBar/index.js @@ -5,12 +5,12 @@ import {connect} from 'react-redux'; import {IconButton, SideBar} from '@neos-project/react-ui-components'; import {actions, selectors} 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 => ({ - 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')} >