diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index cfcb433db2..d122892d39 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1558,7 +1558,8 @@ "globalInitialImageLayer": "$t(controlLayers.globalInitialImage) $t(unifiedCanvas.layer)", "opacityFilter": "Opacity Filter", "clearProcessor": "Clear Processor", - "resetProcessor": "Reset Processor to Defaults" + "resetProcessor": "Reset Processor to Defaults", + "noLayersAdded": "No Layers Added" }, "ui": { "tabs": { diff --git a/invokeai/frontend/web/src/features/controlLayers/components/ControlLayersPanelContent.tsx b/invokeai/frontend/web/src/features/controlLayers/components/ControlLayersPanelContent.tsx index b78beb3df8..1dd79d0220 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/ControlLayersPanelContent.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/ControlLayersPanelContent.tsx @@ -2,6 +2,7 @@ import { Flex } from '@invoke-ai/ui-library'; import { createMemoizedSelector } from 'app/store/createMemoizedSelector'; import { useAppSelector } from 'app/store/storeHooks'; +import { IAINoContentFallback } from 'common/components/IAIImageFallback'; import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent'; import { AddLayerButton } from 'features/controlLayers/components/AddLayerButton'; import { CALayer } from 'features/controlLayers/components/CALayer/CALayer'; @@ -13,6 +14,7 @@ import { isRenderableLayer, selectControlLayersSlice } from 'features/controlLay import type { Layer } from 'features/controlLayers/store/types'; import { partition } from 'lodash-es'; import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; const selectLayerIdTypePairs = createMemoizedSelector(selectControlLayersSlice, (controlLayers) => { const [renderableLayers, ipAdapterLayers] = partition(controlLayers.present.layers, isRenderableLayer); @@ -20,6 +22,7 @@ const selectLayerIdTypePairs = createMemoizedSelector(selectControlLayersSlice, }); export const ControlLayersPanelContent = memo(() => { + const { t } = useTranslation(); const layerIdTypePairs = useAppSelector(selectLayerIdTypePairs); return ( @@ -27,13 +30,16 @@ export const ControlLayersPanelContent = memo(() => { - - - {layerIdTypePairs.map(({ id, type }) => ( - - ))} - - + {layerIdTypePairs.length > 0 && ( + + + {layerIdTypePairs.map(({ id, type }) => ( + + ))} + + + )} + {layerIdTypePairs.length === 0 && } ); }); diff --git a/invokeai/frontend/web/src/features/controlLayers/util/renderers.ts b/invokeai/frontend/web/src/features/controlLayers/util/renderers.ts index 09db523a61..b437c95650 100644 --- a/invokeai/frontend/web/src/features/controlLayers/util/renderers.ts +++ b/invokeai/frontend/web/src/features/controlLayers/util/renderers.ts @@ -40,6 +40,7 @@ import type { VectorMaskRect, } from 'features/controlLayers/store/types'; import { getLayerBboxFast, getLayerBboxPixels } from 'features/controlLayers/util/bbox'; +import { t } from 'i18next'; import Konva from 'konva'; import type { IRect, Vector2d } from 'konva/lib/types'; import { debounce } from 'lodash-es'; @@ -819,7 +820,7 @@ const createNoLayersMessageLayer = (stage: Konva.Stage): Konva.Layer => { y: 0, align: 'center', verticalAlign: 'middle', - text: 'No Layers Added', + text: t('controlLayers.noLayersAdded'), fontFamily: '"Inter Variable", sans-serif', fontStyle: '600', fill: 'white',