From f258aba6d1ac914c2c3ce5a0134007d735aba0ad Mon Sep 17 00:00:00 2001 From: blessedcoolant <54517381+blessedcoolant@users.noreply.github.com> Date: Sun, 23 Apr 2023 00:55:22 +1200 Subject: [PATCH 01/26] chore(ui): Make the Node UI Legend Responsive --- .../features/nodes/components/FieldTypeLegend.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/invokeai/frontend/web/src/features/nodes/components/FieldTypeLegend.tsx b/invokeai/frontend/web/src/features/nodes/components/FieldTypeLegend.tsx index 4f46b03b7a..1e86ebfd97 100644 --- a/invokeai/frontend/web/src/features/nodes/components/FieldTypeLegend.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/FieldTypeLegend.tsx @@ -1,20 +1,24 @@ import 'reactflow/dist/style.css'; -import { Tooltip, Badge, HStack } from '@chakra-ui/react'; +import { Tooltip, Badge, Flex } from '@chakra-ui/react'; import { map } from 'lodash'; import { FIELDS } from '../types/constants'; import { memo } from 'react'; const FieldTypeLegend = () => { return ( - + {map(FIELDS, ({ title, description, color }, key) => ( - + {title} ))} - + ); }; From b73fd2a6d2f8396bb986d1085877f2c43c2f1d23 Mon Sep 17 00:00:00 2001 From: blessedcoolant <54517381+blessedcoolant@users.noreply.github.com> Date: Sun, 23 Apr 2023 00:55:43 +1200 Subject: [PATCH 02/26] fix(ui): Set Min Width for Nodes --- invokeai/frontend/web/src/app/constants.ts | 2 ++ .../src/features/nodes/components/IAINode/IAINodeResizer.tsx | 3 ++- .../web/src/features/nodes/components/InvocationComponent.tsx | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/app/constants.ts b/invokeai/frontend/web/src/app/constants.ts index e7cb1972fa..b9cd5839df 100644 --- a/invokeai/frontend/web/src/app/constants.ts +++ b/invokeai/frontend/web/src/app/constants.ts @@ -60,3 +60,5 @@ export const IN_PROGRESS_IMAGE_TYPES: Array<{ { key: 'Fast', value: 'latents' }, { key: 'Accurate', value: 'full-res' }, ]; + +export const NODE_MIN_WIDTH = 250; diff --git a/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeResizer.tsx b/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeResizer.tsx index 0fa13c82b6..1217540827 100644 --- a/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeResizer.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/IAINode/IAINodeResizer.tsx @@ -1,3 +1,4 @@ +import { NODE_MIN_WIDTH } from 'app/constants'; import { memo } from 'react'; import { NodeResizeControl, NodeResizerProps } from 'reactflow'; @@ -14,7 +15,7 @@ const IAINodeResizer = (props: NodeResizerProps) => { bottom: 0, right: 0, }} - minWidth={350} + minWidth={NODE_MIN_WIDTH} {...rest} > ); diff --git a/invokeai/frontend/web/src/features/nodes/components/InvocationComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/InvocationComponent.tsx index c0ddf1c3b3..e6d54a72c5 100644 --- a/invokeai/frontend/web/src/features/nodes/components/InvocationComponent.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/InvocationComponent.tsx @@ -12,6 +12,7 @@ import { RootState } from 'app/store'; import { AnyInvocationType } from 'services/events/types'; import { createSelector } from '@reduxjs/toolkit'; import { useAppSelector } from 'app/storeHooks'; +import { NODE_MIN_WIDTH } from 'app/constants'; type InvocationComponentWrapperProps = PropsWithChildren & { selected: boolean; @@ -28,6 +29,7 @@ const InvocationComponentWrapper = (props: InvocationComponentWrapperProps) => { sx={{ position: 'relative', borderRadius: 'md', + minWidth: NODE_MIN_WIDTH, boxShadow: props.selected ? `${nodeSelectedOutline}, ${nodeShadow}` : `${nodeShadow}`, From d26b44104a6d50a57d54e20fc663da76110fd93c Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Sun, 23 Apr 2023 00:45:03 +1000 Subject: [PATCH 03/26] fix(ui): minor tidy --- .../web/src/features/nodes/components/FieldHandle.tsx | 2 -- .../src/features/nodes/components/IAINode/IAINodeInputs.tsx | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/invokeai/frontend/web/src/features/nodes/components/FieldHandle.tsx b/invokeai/frontend/web/src/features/nodes/components/FieldHandle.tsx index b13db30690..f21ab09be3 100644 --- a/invokeai/frontend/web/src/features/nodes/components/FieldHandle.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/FieldHandle.tsx @@ -42,8 +42,6 @@ const FieldHandle = (props: FieldHandleProps) => { const { nodeId, field, isValidConnection, handleType, styles } = props; const { name, title, type, description } = field; - console.log(props); - return ( { ); if (index < inputSockets.length) { - IAINodeInputsToRender.push(); + IAINodeInputsToRender.push( + + ); } IAINodeInputsToRender.push( From b763f1809e6c71bd716867adfe480e93c83112a3 Mon Sep 17 00:00:00 2001 From: blessedcoolant <54517381+blessedcoolant@users.noreply.github.com> Date: Sun, 23 Apr 2023 02:52:32 +1200 Subject: [PATCH 04/26] feat(ui): Stylize Node Minimap --- .../src/features/nodes/components/Flow.tsx | 13 +++---- .../nodes/components/panels/MinimapPanel.tsx | 34 +++++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx diff --git a/invokeai/frontend/web/src/features/nodes/components/Flow.tsx b/invokeai/frontend/web/src/features/nodes/components/Flow.tsx index 173458d285..38c1b43943 100644 --- a/invokeai/frontend/web/src/features/nodes/components/Flow.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/Flow.tsx @@ -1,6 +1,5 @@ import { Background, - MiniMap, OnConnect, OnEdgesChange, OnNodesChange, @@ -23,6 +22,7 @@ import TopLeftPanel from './panels/TopLeftPanel'; import TopRightPanel from './panels/TopRightPanel'; import TopCenterPanel from './panels/TopCenterPanel'; import BottomLeftPanel from './panels/BottomLeftPanel.tsx'; +import MinimapPanel from './panels/MinimapPanel'; const nodeTypes = { invocation: InvocationComponent }; @@ -59,12 +59,9 @@ export const Flow = () => { [dispatch] ); - const onConnectEnd: OnConnectEnd = useCallback( - (event) => { - dispatch(connectionEnded()); - }, - [dispatch] - ); + const onConnectEnd: OnConnectEnd = useCallback(() => { + dispatch(connectionEnded()); + }, [dispatch]); return ( { - + ); }; diff --git a/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx b/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx new file mode 100644 index 0000000000..33c5605310 --- /dev/null +++ b/invokeai/frontend/web/src/features/nodes/components/panels/MinimapPanel.tsx @@ -0,0 +1,34 @@ +import { RootState } from 'app/store'; +import { useAppSelector } from 'app/storeHooks'; +import { CSSProperties, memo } from 'react'; +import { MiniMap } from 'reactflow'; + +const MinimapStyle: CSSProperties = { + background: 'var(--invokeai-colors-base-500)', +}; + +const MinimapPanel = () => { + const currentTheme = useAppSelector( + (state: RootState) => state.ui.currentTheme + ); + + return ( + + ); +}; + +export default memo(MinimapPanel); From ff891b1ff22c04c5d50c735a2ca7467d6b96447c Mon Sep 17 00:00:00 2001 From: blessedcoolant <54517381+blessedcoolant@users.noreply.github.com> Date: Sun, 23 Apr 2023 13:35:02 +1200 Subject: [PATCH 05/26] feat(ui): Basic Node Search Component Very buggy --- .../src/features/nodes/components/Flow.tsx | 4 +- .../nodes/components/search/NodeSearch.tsx | 179 ++++++++++++++++++ 2 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx diff --git a/invokeai/frontend/web/src/features/nodes/components/Flow.tsx b/invokeai/frontend/web/src/features/nodes/components/Flow.tsx index 38c1b43943..5c433ad488 100644 --- a/invokeai/frontend/web/src/features/nodes/components/Flow.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/Flow.tsx @@ -23,6 +23,7 @@ import TopRightPanel from './panels/TopRightPanel'; import TopCenterPanel from './panels/TopCenterPanel'; import BottomLeftPanel from './panels/BottomLeftPanel.tsx'; import MinimapPanel from './panels/MinimapPanel'; +import NodeSearch from './search/NodeSearch'; const nodeTypes = { invocation: InvocationComponent }; @@ -77,7 +78,8 @@ export const Flow = () => { style: { strokeWidth: 2 }, }} > - + + {/* */} diff --git a/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx b/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx new file mode 100644 index 0000000000..9a05a6d2a0 --- /dev/null +++ b/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx @@ -0,0 +1,179 @@ +import { Box, Flex } from '@chakra-ui/layout'; +import { RootState } from 'app/store'; +import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import IAIInput from 'common/components/IAIInput'; +import { Panel } from 'reactflow'; +import { map } from 'lodash'; +import { + FocusEvent, + KeyboardEvent, + memo, + ReactNode, + useCallback, + useRef, + useState, +} from 'react'; +import { Tooltip } from '@chakra-ui/tooltip'; +import { AnyInvocationType } from 'services/events/types'; +import { useBuildInvocation } from 'features/nodes/hooks/useBuildInvocation'; +import { makeToast } from 'features/system/hooks/useToastWatcher'; +import { addToast } from 'features/system/store/systemSlice'; +import { nodeAdded } from '../../store/nodesSlice'; + +interface NodeListItemProps { + title: string; + description: string; + type: AnyInvocationType; + isSelected: boolean; + addNode: (nodeType: AnyInvocationType) => void; +} + +const NodeListItem = (props: NodeListItemProps) => { + const { title, description, type, isSelected, addNode } = props; + return ( + + addNode(type)} + background={isSelected ? 'base.600' : 'none'} + _hover={{ + background: 'base.600', + cursor: 'pointer', + }} + > + {title} + + + ); +}; + +NodeListItem.displayName = 'NodeListItem'; + +const NodeSearch = () => { + const invocationTemplates = useAppSelector( + (state: RootState) => state.nodes.invocationTemplates + ); + + const nodes = map(invocationTemplates); + + const buildInvocation = useBuildInvocation(); + const dispatch = useAppDispatch(); + + const [searchText, setSearchText] = useState(''); + const [showNodeList, setShowNodeList] = useState(false); + const [focusedIndex, setFocusedIndex] = useState(-1); + const nodeSearchRef = useRef(null); + + const addNode = useCallback( + (nodeType: AnyInvocationType) => { + const invocation = buildInvocation(nodeType); + + if (!invocation) { + const toast = makeToast({ + status: 'error', + title: `Unknown Invocation type ${nodeType}`, + }); + dispatch(addToast(toast)); + return; + } + + dispatch(nodeAdded(invocation)); + }, + [dispatch, buildInvocation] + ); + + const renderNodeList = () => { + const nodeListToRender: ReactNode[] = []; + + nodes.forEach(({ title, description, type }, index) => { + if (title.toLowerCase().includes(searchText)) { + nodeListToRender.push( + + ); + } else { + ; + } + }); + + return ( + + {nodeListToRender} + + ); + }; + + const searchKeyHandler = (e: KeyboardEvent) => { + const { key } = e; + let nextIndex = 0; + + if (key === 'ArrowDown') { + setShowNodeList(true); + nextIndex = (focusedIndex + 1) % nodes.length; + } + + if (key === 'ArrowUp') { + setShowNodeList(true); + nextIndex = (focusedIndex + nodes.length - 1) % nodes.length; + } + + // # TODO Handle Blur + // if (key === 'Escape') { + // } + + if (key === 'Enter') { + const selectedNodeType = nodes[focusedIndex].type; + addNode(selectedNodeType); + setShowNodeList(false); + } + + setFocusedIndex(nextIndex); + }; + + const searchInputBlurHandler = (e: FocusEvent) => { + if (!e.currentTarget.contains(e.relatedTarget)) setShowNodeList(false); + }; + + return ( + + setShowNodeList(true)} + onBlur={searchInputBlurHandler} + ref={nodeSearchRef} + > + { + setSearchText(e.target.value); + setShowNodeList(true); + }} + /> + {showNodeList && renderNodeList()} + + + ); +}; + +export default memo(NodeSearch); From 3f334d9e5e52586916b77ce246d40654033c18c2 Mon Sep 17 00:00:00 2001 From: blessedcoolant <54517381+blessedcoolant@users.noreply.github.com> Date: Sun, 23 Apr 2023 15:14:44 +1200 Subject: [PATCH 06/26] feat(ui): Add fusejs to NodeSearch --- invokeai/frontend/web/package.json | 1 + .../nodes/components/search/NodeSearch.tsx | 92 +++++++++++++------ invokeai/frontend/web/yarn.lock | 5 + 3 files changed, 68 insertions(+), 30 deletions(-) diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json index 585d28007a..4cedfd81e8 100644 --- a/invokeai/frontend/web/package.json +++ b/invokeai/frontend/web/package.json @@ -54,6 +54,7 @@ "dateformat": "^5.0.3", "formik": "^2.2.9", "framer-motion": "^9.0.4", + "fuse.js": "^6.6.2", "i18next": "^22.4.10", "i18next-browser-languagedetector": "^7.0.1", "i18next-http-backend": "^2.1.1", diff --git a/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx b/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx index 9a05a6d2a0..a24688eb8a 100644 --- a/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx @@ -5,6 +5,7 @@ import IAIInput from 'common/components/IAIInput'; import { Panel } from 'reactflow'; import { map } from 'lodash'; import { + ChangeEvent, FocusEvent, KeyboardEvent, memo, @@ -19,6 +20,8 @@ import { useBuildInvocation } from 'features/nodes/hooks/useBuildInvocation'; import { makeToast } from 'features/system/hooks/useToastWatcher'; import { addToast } from 'features/system/store/systemSlice'; import { nodeAdded } from '../../store/nodesSlice'; +import Fuse from 'fuse.js'; +import { InvocationTemplate } from 'features/nodes/types/types'; interface NodeListItemProps { title: string; @@ -55,6 +58,9 @@ const NodeSearch = () => { ); const nodes = map(invocationTemplates); + const [filteredNodes, setFilteredNodes] = useState< + Fuse.FuseResult[] + >([]); const buildInvocation = useBuildInvocation(); const dispatch = useAppDispatch(); @@ -64,6 +70,21 @@ const NodeSearch = () => { const [focusedIndex, setFocusedIndex] = useState(-1); const nodeSearchRef = useRef(null); + const fuseOptions = { + findAllMatches: true, + threshold: 0, + ignoreLocation: true, + keys: ['title', 'type', 'tags'], + }; + + const fuse = new Fuse(nodes, fuseOptions); + + const findNode = (e: ChangeEvent) => { + setSearchText(e.target.value); + setFilteredNodes(fuse.search(e.target.value)); + setShowNodeList(true); + }; + const addNode = useCallback( (nodeType: AnyInvocationType) => { const invocation = buildInvocation(nodeType); @@ -85,8 +106,24 @@ const NodeSearch = () => { const renderNodeList = () => { const nodeListToRender: ReactNode[] = []; - nodes.forEach(({ title, description, type }, index) => { - if (title.toLowerCase().includes(searchText)) { + if (searchText.length > 0) { + filteredNodes.forEach(({ item }, index) => { + const { title, description, type } = item; + if (title.toLowerCase().includes(searchText)) { + nodeListToRender.push( + + ); + } + }); + } else { + nodes.forEach(({ title, description, type }, index) => { nodeListToRender.push( { addNode={addNode} /> ); - } else { - ; - } - }); + }); + } return ( - + {nodeListToRender} ); @@ -128,12 +150,21 @@ const NodeSearch = () => { if (key === 'ArrowDown') { setShowNodeList(true); - nextIndex = (focusedIndex + 1) % nodes.length; + if (searchText.length > 0) { + nextIndex = (focusedIndex + 1) % filteredNodes.length; + } else { + nextIndex = (focusedIndex + 1) % nodes.length; + } } if (key === 'ArrowUp') { setShowNodeList(true); - nextIndex = (focusedIndex + nodes.length - 1) % nodes.length; + if (searchText.length > 0) { + nextIndex = + (focusedIndex + filteredNodes.length - 1) % filteredNodes.length; + } else { + nextIndex = (focusedIndex + filteredNodes.length - 1) % nodes.length; + } } // # TODO Handle Blur @@ -141,7 +172,14 @@ const NodeSearch = () => { // } if (key === 'Enter') { - const selectedNodeType = nodes[focusedIndex].type; + let selectedNodeType: AnyInvocationType; + + if (searchText.length > 0) { + selectedNodeType = filteredNodes[focusedIndex].item.type; + } else { + selectedNodeType = nodes[focusedIndex].type; + } + addNode(selectedNodeType); setShowNodeList(false); } @@ -163,13 +201,7 @@ const NodeSearch = () => { onBlur={searchInputBlurHandler} ref={nodeSearchRef} > - { - setSearchText(e.target.value); - setShowNodeList(true); - }} - /> + {showNodeList && renderNodeList()} diff --git a/invokeai/frontend/web/yarn.lock b/invokeai/frontend/web/yarn.lock index 4c7edbffd7..8688f1fd41 100644 --- a/invokeai/frontend/web/yarn.lock +++ b/invokeai/frontend/web/yarn.lock @@ -3454,6 +3454,11 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +fuse.js@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111" + integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== + get-amd-module-type@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz#46550cee2b8e1fa4c3f2c8a5753c36990aa49ab0" From 11ab5c7d56bd5ec607e5adcdc75e663629cc7c5d Mon Sep 17 00:00:00 2001 From: blessedcoolant <54517381+blessedcoolant@users.noreply.github.com> Date: Sun, 23 Apr 2023 15:18:35 +1200 Subject: [PATCH 07/26] fix(ui): Fix up arrow not working on unfiltered list --- .../web/src/features/nodes/components/search/NodeSearch.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx b/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx index a24688eb8a..c301a1a863 100644 --- a/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/search/NodeSearch.tsx @@ -163,7 +163,7 @@ const NodeSearch = () => { nextIndex = (focusedIndex + filteredNodes.length - 1) % filteredNodes.length; } else { - nextIndex = (focusedIndex + filteredNodes.length - 1) % nodes.length; + nextIndex = (focusedIndex + nodes.length - 1) % nodes.length; } } From 9f8ff912c4818d22ebfd45ac7adb956cbbd31c1b Mon Sep 17 00:00:00 2001 From: Mary Hipp Date: Sat, 22 Apr 2023 14:01:55 -0400 Subject: [PATCH 08/26] feat(ui): add support for shouldFetchImages if UI needs to re-fetch an image URL --- invokeai/frontend/web/src/app/App.tsx | 6 +++ invokeai/frontend/web/src/component.tsx | 9 +++- .../components/ImageGalleryContent.tsx | 2 +- .../features/gallery/store/resultsSlice.ts | 44 +++++++++++++++++-- .../web/src/services/events/middleware.ts | 17 +++++++ .../frontend/web/src/services/thunks/image.ts | 15 +++++++ 6 files changed, 88 insertions(+), 5 deletions(-) diff --git a/invokeai/frontend/web/src/app/App.tsx b/invokeai/frontend/web/src/app/App.tsx index 6a22610e46..d2287136c3 100644 --- a/invokeai/frontend/web/src/app/App.tsx +++ b/invokeai/frontend/web/src/app/App.tsx @@ -18,6 +18,7 @@ import { PropsWithChildren, useEffect } from 'react'; import { setDisabledPanels, setDisabledTabs } from 'features/ui/store/uiSlice'; import { InvokeTabName } from 'features/ui/store/tabMap'; import { shouldTransformUrlsChanged } from 'features/system/store/systemSlice'; +import { setShouldFetchImages } from 'features/gallery/store/resultsSlice'; keepGUIAlive(); @@ -26,6 +27,7 @@ interface Props extends PropsWithChildren { disabledPanels: string[]; disabledTabs: InvokeTabName[]; shouldTransformUrls?: boolean; + shouldFetchImages: boolean; }; } @@ -50,6 +52,10 @@ const App = (props: Props) => { ); }, [dispatch, props.options.shouldTransformUrls]); + useEffect(() => { + dispatch(setShouldFetchImages(props.options.shouldFetchImages)); + }, [dispatch, props.options.shouldFetchImages]); + useEffect(() => { setColorMode(['light'].includes(currentTheme) ? 'light' : 'dark'); }, [setColorMode, currentTheme]); diff --git a/invokeai/frontend/web/src/component.tsx b/invokeai/frontend/web/src/component.tsx index 01c3513a78..c4cd876fbd 100644 --- a/invokeai/frontend/web/src/component.tsx +++ b/invokeai/frontend/web/src/component.tsx @@ -30,6 +30,7 @@ interface Props extends PropsWithChildren { disabledTabs?: InvokeTabName[]; token?: string; shouldTransformUrls?: boolean; + shouldFetchImages?: boolean; } export default function Component({ @@ -39,6 +40,7 @@ export default function Component({ token, children, shouldTransformUrls, + shouldFetchImages = false, }: Props) { useEffect(() => { // configure API client token @@ -70,7 +72,12 @@ export default function Component({ }> {children} diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 31a2c4b055..327326a403 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -254,7 +254,7 @@ const ImageGalleryContent = () => { const isSelected = currentImageUuid === name; return ( diff --git a/invokeai/frontend/web/src/features/gallery/store/resultsSlice.ts b/invokeai/frontend/web/src/features/gallery/store/resultsSlice.ts index bb789a4a5f..e0165eab8a 100644 --- a/invokeai/frontend/web/src/features/gallery/store/resultsSlice.ts +++ b/invokeai/frontend/web/src/features/gallery/store/resultsSlice.ts @@ -1,4 +1,8 @@ -import { createEntityAdapter, createSlice } from '@reduxjs/toolkit'; +import { + PayloadAction, + createEntityAdapter, + createSlice, +} from '@reduxjs/toolkit'; import { Image } from 'app/invokeai'; import { invocationComplete } from 'services/events/actions'; @@ -13,6 +17,7 @@ import { extractTimestampFromImageName, } from 'services/util/deserializeImageField'; import { deserializeImageResponse } from 'services/util/deserializeImageResponse'; +import { imageReceived, thumbnailReceived } from 'services/thunks/image'; // use `createEntityAdapter` to create a slice for results images // https://redux-toolkit.js.org/api/createEntityAdapter#overview @@ -34,6 +39,7 @@ type AdditionalResultsState = { pages: number; // the total number of pages available isLoading: boolean; // whether we are loading more images or not, mostly a placeholder nextPage: number; // the next page to request + shouldFetchImages: boolean; // whether we need to re-fetch images or not }; export const initialResultsState = @@ -43,6 +49,7 @@ export const initialResultsState = pages: 0, isLoading: false, nextPage: 0, + shouldFetchImages: false, }); export type ResultsState = typeof initialResultsState; @@ -57,6 +64,10 @@ const resultsSlice = createSlice({ // here we just use the function itself as the reducer. we'll call this on `invocation_complete` // to add a single result resultAdded: resultsAdapter.upsertOne, + + setShouldFetchImages: (state, action: PayloadAction) => { + state.shouldFetchImages = action.payload; + }, }, extraReducers: (builder) => { // here we can respond to a fulfilled call of the `getNextResultsPage` thunk @@ -98,7 +109,10 @@ const resultsSlice = createSlice({ if (isImageOutput(result)) { const name = result.image.image_name; const type = result.image.image_type; - const { url, thumbnail } = buildImageUrls(type, name); + // if we need to refetch, set URLs to placeholder for now + const { url, thumbnail } = state.shouldFetchImages + ? { url: '', thumbnail: '' } + : buildImageUrls(type, name); const timestamp = extractTimestampFromImageName(name); @@ -121,6 +135,30 @@ const resultsSlice = createSlice({ resultsAdapter.addOne(state, image); } }); + + builder.addCase(imageReceived.fulfilled, (state, action) => { + const { imagePath } = action.payload; + const { imageName } = action.meta.arg; + + resultsAdapter.updateOne(state, { + id: imageName, + changes: { + url: imagePath, + }, + }); + }); + + builder.addCase(thumbnailReceived.fulfilled, (state, action) => { + const { thumbnailPath } = action.payload; + const { imageName } = action.meta.arg; + + resultsAdapter.updateOne(state, { + id: imageName, + changes: { + thumbnail: thumbnailPath, + }, + }); + }); }, }); @@ -134,6 +172,6 @@ export const { selectTotal: selectResultsTotal, } = resultsAdapter.getSelectors((state) => state.results); -export const { resultAdded } = resultsSlice.actions; +export const { resultAdded, setShouldFetchImages } = resultsSlice.actions; export default resultsSlice.reducer; diff --git a/invokeai/frontend/web/src/services/events/middleware.ts b/invokeai/frontend/web/src/services/events/middleware.ts index 9a462a1f85..33e198d797 100644 --- a/invokeai/frontend/web/src/services/events/middleware.ts +++ b/invokeai/frontend/web/src/services/events/middleware.ts @@ -30,6 +30,8 @@ import { import { OpenAPI } from 'services/api'; import { receivedModels } from 'services/thunks/model'; import { receivedOpenAPISchema } from 'services/thunks/schema'; +import { isImageOutput } from 'services/types/guards'; +import { imageReceived, thumbnailReceived } from 'services/thunks/image'; export const socketMiddleware = () => { let areListenersSet = false; @@ -213,6 +215,21 @@ export const socketMiddleware = () => { dispatch(sessionInvoked({ sessionId })); } + if (invocationComplete.match(action)) { + const { results } = getState(); + + if (results.shouldFetchImages) { + const { result } = action.payload.data; + if (isImageOutput(result)) { + const imageName = result.image.image_name; + const imageType = result.image.image_type; + + dispatch(imageReceived({ imageName, imageType })); + dispatch(thumbnailReceived({ imageName, imageType })); + } + } + } + // Always pass the action on so other middleware and reducers can handle it next(action); }; diff --git a/invokeai/frontend/web/src/services/thunks/image.ts b/invokeai/frontend/web/src/services/thunks/image.ts index 7014925d87..d7318f318c 100644 --- a/invokeai/frontend/web/src/services/thunks/image.ts +++ b/invokeai/frontend/web/src/services/thunks/image.ts @@ -16,6 +16,21 @@ export const imageReceived = createAppAsyncThunk( } ); +type ThumbnailReceivedArg = Parameters< + (typeof ImagesService)['getThumbnail'] +>[0]; + +/** + * `ImagesService.getThumbnail()` thunk + */ +export const thumbnailReceived = createAppAsyncThunk( + 'api/thumbnailReceived', + async (arg: ThumbnailReceivedArg, _thunkApi) => { + const response = await ImagesService.getThumbnail(arg); + return response; + } +); + type ImageUploadedArg = Parameters<(typeof ImagesService)['uploadImage']>[0]; /** From 59b0153236805cbb6df46313f3cbcb79e921e6f0 Mon Sep 17 00:00:00 2001 From: Mary Hipp Date: Sat, 22 Apr 2023 16:32:33 -0400 Subject: [PATCH 09/26] add to types --- invokeai/frontend/web/index.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/invokeai/frontend/web/index.d.ts b/invokeai/frontend/web/index.d.ts index af21f29231..3006a22d93 100644 --- a/invokeai/frontend/web/index.d.ts +++ b/invokeai/frontend/web/index.d.ts @@ -81,6 +81,7 @@ interface InvokeProps extends PropsWithChildren { disabledTabs?: InvokeTabName[]; token?: string; shouldTransformUrls?: boolean; + shouldFetchImages?: boolean; } declare function Invoke(props: InvokeProps): JSX.Element; From e6158d1874a3acbf79b8203ce0116c67545b9341 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Sun, 23 Apr 2023 17:49:02 +1000 Subject: [PATCH 10/26] feat(ui): add reload schema button --- .../nodes/components/panels/TopCenterPanel.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/invokeai/frontend/web/src/features/nodes/components/panels/TopCenterPanel.tsx b/invokeai/frontend/web/src/features/nodes/components/panels/TopCenterPanel.tsx index dfedb284ec..1d007e3657 100644 --- a/invokeai/frontend/web/src/features/nodes/components/panels/TopCenterPanel.tsx +++ b/invokeai/frontend/web/src/features/nodes/components/panels/TopCenterPanel.tsx @@ -1,7 +1,9 @@ +import { HStack } from '@chakra-ui/react'; import { useAppDispatch } from 'app/storeHooks'; import IAIButton from 'common/components/IAIButton'; import { memo, useCallback } from 'react'; import { Panel } from 'reactflow'; +import { receivedOpenAPISchema } from 'services/thunks/schema'; import { nodesGraphBuilt } from 'services/thunks/session'; const TopCenterPanel = () => { @@ -11,11 +13,18 @@ const TopCenterPanel = () => { dispatch(nodesGraphBuilt()); }, [dispatch]); + const handleReloadSchema = useCallback(() => { + dispatch(receivedOpenAPISchema()); + }, [dispatch]); + return ( - - Will it blend? - + + + Will it blend? + + Reload Schema + ); }; From cf28617cd6f72a3e2da95ce048a12ca7690df338 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Sun, 23 Apr 2023 21:27:02 +0100 Subject: [PATCH 11/26] Event service will now sleep for 100ms between polls instead of 1ms, reducing CPU usage significantly --- invokeai/app/api/events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/app/api/events.py b/invokeai/app/api/events.py index bcfaad35a1..41414a9230 100644 --- a/invokeai/app/api/events.py +++ b/invokeai/app/api/events.py @@ -45,7 +45,7 @@ class FastAPIEventService(EventServiceBase): ) except Empty: - await asyncio.sleep(0.001) + await asyncio.sleep(0.1) pass except asyncio.CancelledError as e: From 1e055383645cdc3a09fb14a08114572a510efd68 Mon Sep 17 00:00:00 2001 From: techybrain-dev Date: Mon, 24 Apr 2023 08:03:44 +0200 Subject: [PATCH 12/26] translationBot(ui): added translation (Vietnamese) Co-authored-by: techybrain-dev --- invokeai/frontend/web/public/locales/vi.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 invokeai/frontend/web/public/locales/vi.json diff --git a/invokeai/frontend/web/public/locales/vi.json b/invokeai/frontend/web/public/locales/vi.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/invokeai/frontend/web/public/locales/vi.json @@ -0,0 +1 @@ +{} From 17d0920186889c58fcd1bf1658f3fb370757160f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=BE=A4=20=E5=85=8B=E5=B9=B8?= <4ranci0ne@gmail.com> Date: Mon, 24 Apr 2023 08:03:44 +0200 Subject: [PATCH 13/26] translationBot(ui): update translation (Japanese) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 73.0% (368 of 504 strings) Co-authored-by: 唐澤 克幸 <4ranci0ne@gmail.com> Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ja/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/ja.json | 73 ++++++++++++++++++-- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/invokeai/frontend/web/public/locales/ja.json b/invokeai/frontend/web/public/locales/ja.json index 542cffbb74..007aa9b491 100644 --- a/invokeai/frontend/web/public/locales/ja.json +++ b/invokeai/frontend/web/public/locales/ja.json @@ -37,7 +37,43 @@ "statusUpscaling": "アップスケーリング", "statusUpscalingESRGAN": "アップスケーリング (ESRGAN)", "statusLoadingModel": "モデルを読み込む", - "statusModelChanged": "モデルを変更" + "statusModelChanged": "モデルを変更", + "cancel": "キャンセル", + "accept": "同意", + "langBrPortuguese": "Português do Brasil", + "langRussian": "Русский", + "langSimplifiedChinese": "简体中文", + "langUkranian": "Украї́нська", + "langSpanish": "Español", + "img2img": "img2img", + "unifiedCanvas": "Unified Canvas", + "statusMergingModels": "モデルのマージ", + "statusModelConverted": "変換済モデル", + "statusGeneratingInpainting": "Inpaintingを生成", + "statusIterationComplete": "Iteration Complete", + "statusGeneratingOutpainting": "Outpaintingを生成", + "loading": "ロード中", + "loadingInvokeAI": "Invoke AIをロード中", + "statusConvertingModel": "モデルの変換", + "statusMergedModels": "マージ済モデル", + "pinOptionsPanel": "オプションパネルを固定", + "githubLabel": "Github", + "hotkeysLabel": "ホットキー", + "langHebrew": "עברית", + "discordLabel": "Discord", + "langItalian": "Italiano", + "langEnglish": "English", + "oceanTheme": "オーシャン", + "langArabic": "アラビア語", + "langDutch": "Nederlands", + "langFrench": "Français", + "langGerman": "Deutsch", + "langPortuguese": "Português", + "nodes": "ノード", + "langKorean": "한국어", + "langPolish": "Polski", + "txt2img": "txt2img", + "postprocessing": "Post Processing" }, "gallery": { "uploads": "アップロード", @@ -46,11 +82,14 @@ "galleryImageResetSize": "サイズをリセット", "gallerySettings": "ギャラリーの設定", "maintainAspectRatio": "アスペクト比を維持", - "singleColumnLayout": "シングルカラムレイアウト", + "singleColumnLayout": "1カラムレイアウト", "pinGallery": "ギャラリーにピン留め", "allImagesLoaded": "すべての画像を読み込む", "loadMore": "さらに読み込む", - "noImagesInGallery": "ギャラリーに画像がありません" + "noImagesInGallery": "ギャラリーに画像がありません", + "generations": "生成", + "showGenerations": "生成過程を見る", + "autoSwitchNewImages": "新しい画像に自動切替" }, "hotkeys": { "keyboardShortcuts": "キーボードショートカット", @@ -59,14 +98,16 @@ "galleryHotkeys": "ギャラリーのホットキー", "unifiedCanvasHotkeys": "Unified Canvasのホットキー", "invoke": { - "desc": "画像を生成" + "desc": "画像を生成", + "title": "Invoke" }, "cancel": { "title": "キャンセル", "desc": "画像の生成をキャンセル" }, "focusPrompt": { - "desc": "プロンプトテキストボックスにフォーカス" + "desc": "プロンプトテキストボックスにフォーカス", + "title": "プロジェクトにフォーカス" }, "toggleOptions": { "title": "オプションパネルのトグル", @@ -410,5 +451,27 @@ "accept": "同意", "showHide": "表示/非表示", "discardAll": "すべて破棄" + }, + "accessibility": { + "modelSelect": "モデルを選択", + "invokeProgressBar": "進捗バー", + "reset": "リセット", + "uploadImage": "画像をアップロード", + "previousImage": "前の画像", + "nextImage": "次の画像", + "useThisParameter": "このパラメータを使用する", + "copyMetadataJson": "メタデータをコピー(JSON)", + "zoomIn": "ズームイン", + "exitViewer": "ExitViewer", + "zoomOut": "ズームアウト", + "rotateCounterClockwise": "反時計回りに回転", + "rotateClockwise": "時計回りに回転", + "flipHorizontally": "水平方向に反転", + "flipVertically": "垂直方向に反転", + "toggleAutoscroll": "自動スクロールの切替", + "modifyConfig": "Modify Config", + "toggleLogViewer": "Log Viewerの切替", + "showGallery": "ギャラリーを表示", + "showOptionsPanel": "オプションパネルを表示" } } From 37096a697b681098a46dda9a77c447d2968bf6b0 Mon Sep 17 00:00:00 2001 From: Bouncyknighter Date: Mon, 24 Apr 2023 08:03:45 +0200 Subject: [PATCH 14/26] translationBot(ui): added translation (Mongolian) Co-authored-by: Bouncyknighter --- invokeai/frontend/web/public/locales/mn.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 invokeai/frontend/web/public/locales/mn.json diff --git a/invokeai/frontend/web/public/locales/mn.json b/invokeai/frontend/web/public/locales/mn.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/invokeai/frontend/web/public/locales/mn.json @@ -0,0 +1 @@ +{} From 58c10667652b02463654552a054426ccbe648a56 Mon Sep 17 00:00:00 2001 From: Juuso V Date: Mon, 24 Apr 2023 08:03:45 +0200 Subject: [PATCH 15/26] translationBot(ui): update translation (Finnish) Currently translated at 18.2% (92 of 504 strings) translationBot(ui): added translation (Finnish) Co-authored-by: Juuso V Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/fi/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/fi.json | 122 +++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 invokeai/frontend/web/public/locales/fi.json diff --git a/invokeai/frontend/web/public/locales/fi.json b/invokeai/frontend/web/public/locales/fi.json new file mode 100644 index 0000000000..a6edd6d8b8 --- /dev/null +++ b/invokeai/frontend/web/public/locales/fi.json @@ -0,0 +1,122 @@ +{ + "accessibility": { + "reset": "Resetoi", + "useThisParameter": "Käytä tätä parametria", + "modelSelect": "Mallin Valinta", + "exitViewer": "Poistu katselimesta", + "uploadImage": "Lataa kuva", + "copyMetadataJson": "Kopioi metadata JSON:iin", + "invokeProgressBar": "Invoken edistymispalkki", + "nextImage": "Seuraava kuva", + "previousImage": "Edellinen kuva", + "zoomIn": "Lähennä", + "flipHorizontally": "Käännä vaakasuoraan", + "zoomOut": "Loitonna", + "rotateCounterClockwise": "Kierrä vastapäivään", + "rotateClockwise": "Kierrä myötäpäivään", + "flipVertically": "Käännä pystysuoraan", + "showGallery": "Näytä galleria", + "modifyConfig": "Muokkaa konfiguraatiota", + "toggleAutoscroll": "Kytke automaattinen vieritys", + "toggleLogViewer": "Kytke lokin katselutila", + "showOptionsPanel": "Näytä asetukset" + }, + "common": { + "postProcessDesc2": "Erillinen käyttöliittymä tullaan julkaisemaan helpottaaksemme työnkulkua jälkikäsittelyssä.", + "training": "Kouluta", + "statusLoadingModel": "Ladataan mallia", + "statusModelChanged": "Malli vaihdettu", + "statusConvertingModel": "Muunnetaan mallia", + "statusModelConverted": "Malli muunnettu", + "langFrench": "Ranska", + "langItalian": "Italia", + "languagePickerLabel": "Kielen valinta", + "hotkeysLabel": "Pikanäppäimet", + "reportBugLabel": "Raportoi Bugista", + "langPolish": "Puola", + "themeLabel": "Teema", + "langDutch": "Hollanti", + "settingsLabel": "Asetukset", + "githubLabel": "Github", + "darkTheme": "Tumma", + "lightTheme": "Vaalea", + "greenTheme": "Vihreä", + "langGerman": "Saksa", + "langPortuguese": "Portugali", + "discordLabel": "Discord", + "langEnglish": "Englanti", + "oceanTheme": "Meren sininen", + "langRussian": "Venäjä", + "langUkranian": "Ukraina", + "langSpanish": "Espanja", + "upload": "Lataa", + "statusMergedModels": "Mallit yhdistelty", + "img2img": "Kuva kuvaksi", + "nodes": "Solmut", + "nodesDesc": "Solmupohjainen järjestelmä kuvien generoimiseen on parhaillaan kehitteillä. Pysy kuulolla päivityksistä tähän uskomattomaan ominaisuuteen liittyen.", + "postProcessDesc1": "Invoke AI tarjoaa monenlaisia jälkikäsittelyominaisuukisa. Kuvan laadun skaalaus sekä kasvojen korjaus ovat jo saatavilla WebUI:ssä. Voit ottaa ne käyttöön lisäasetusten valikosta teksti kuvaksi sekä kuva kuvaksi -välilehdiltä. Voit myös suoraan prosessoida kuvia käyttämällä kuvan toimintapainikkeita nykyisen kuvan yläpuolella tai tarkastelussa.", + "postprocessing": "Jälkikäsitellään", + "postProcessing": "Jälkikäsitellään", + "cancel": "Peruuta", + "close": "Sulje", + "accept": "Hyväksy", + "statusConnected": "Yhdistetty", + "statusError": "Virhe", + "statusProcessingComplete": "Prosessointi valmis", + "load": "Lataa", + "back": "Takaisin", + "statusGeneratingTextToImage": "Generoidaan tekstiä kuvaksi", + "trainingDesc2": "InvokeAI tukee jo mukautettujen upotusten kouluttamista tekstin inversiolla käyttäen pääskriptiä.", + "statusDisconnected": "Yhteys katkaistu", + "statusPreparing": "Valmistellaan", + "statusIterationComplete": "Iteraatio valmis", + "statusMergingModels": "Yhdistellään malleja", + "statusProcessingCanceled": "Valmistelu peruutettu", + "statusSavingImage": "Tallennetaan kuvaa", + "statusGeneratingImageToImage": "Generoidaan kuvaa kuvaksi", + "statusRestoringFacesGFPGAN": "Korjataan kasvoja (GFPGAN)", + "statusRestoringFacesCodeFormer": "Korjataan kasvoja (CodeFormer)", + "statusGeneratingInpainting": "Generoidaan sisällemaalausta", + "statusGeneratingOutpainting": "Generoidaan ulosmaalausta", + "statusRestoringFaces": "Korjataan kasvoja", + "pinOptionsPanel": "Kiinnitä asetukset -paneeli", + "loadingInvokeAI": "Ladataan Invoke AI:ta", + "loading": "Ladataan", + "statusGenerating": "Generoidaan", + "txt2img": "Teksti kuvaksi", + "trainingDesc1": "Erillinen työnkulku omien upotusten ja tarkastuspisteiden kouluttamiseksi käyttäen tekstin inversiota ja dreamboothia selaimen käyttöliittymässä.", + "postProcessDesc3": "Invoke AI:n komentorivi tarjoaa paljon muita ominaisuuksia, kuten esimerkiksi Embiggenin.", + "unifiedCanvas": "Yhdistetty kanvas", + "statusGenerationComplete": "Generointi valmis" + }, + "gallery": { + "uploads": "Lataukset", + "showUploads": "Näytä lataukset", + "galleryImageResetSize": "Resetoi koko", + "maintainAspectRatio": "Säilytä kuvasuhde", + "galleryImageSize": "Kuvan koko", + "pinGallery": "Kiinnitä galleria", + "showGenerations": "Näytä generaatiot", + "singleColumnLayout": "Yhden sarakkeen asettelu", + "generations": "Generoinnit", + "gallerySettings": "Gallerian asetukset", + "autoSwitchNewImages": "Vaihda uusiin kuviin automaattisesti", + "allImagesLoaded": "Kaikki kuvat ladattu", + "noImagesInGallery": "Ei kuvia galleriassa", + "loadMore": "Lataa lisää" + }, + "hotkeys": { + "keyboardShortcuts": "näppäimistön pikavalinnat", + "appHotkeys": "Sovelluksen pikanäppäimet", + "generalHotkeys": "Yleiset pikanäppäimet", + "galleryHotkeys": "Gallerian pikanäppäimet", + "unifiedCanvasHotkeys": "Yhdistetyn kanvaan pikanäppäimet", + "cancel": { + "desc": "Peruuta kuvan luominen", + "title": "Peruuta" + }, + "invoke": { + "desc": "Luo kuva" + } + } +} From b8dc9000bd75b37ff0f2a5fa6902f21238077f56 Mon Sep 17 00:00:00 2001 From: Jaulustus Date: Mon, 24 Apr 2023 08:03:46 +0200 Subject: [PATCH 16/26] translationBot(ui): update translation (German) Currently translated at 73.4% (370 of 504 strings) Co-authored-by: Jaulustus Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/de/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/de.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/invokeai/frontend/web/public/locales/de.json b/invokeai/frontend/web/public/locales/de.json index deeef34194..dc78a6446e 100644 --- a/invokeai/frontend/web/public/locales/de.json +++ b/invokeai/frontend/web/public/locales/de.json @@ -489,5 +489,8 @@ "betaDarkenOutside": "Außen abdunkeln", "betaLimitToBox": "Begrenzung auf das Feld", "betaPreserveMasked": "Maskiertes bewahren" + }, + "accessibility": { + "modelSelect": "Model Auswahl" } } From fd00d111ea130726a3d059677686b34a95c5d63d Mon Sep 17 00:00:00 2001 From: Dennis Date: Mon, 24 Apr 2023 08:03:46 +0200 Subject: [PATCH 17/26] translationBot(ui): update translation (Dutch) Currently translated at 100.0% (504 of 504 strings) Co-authored-by: Dennis Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/nl/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/nl.json | 47 ++++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/invokeai/frontend/web/public/locales/nl.json b/invokeai/frontend/web/public/locales/nl.json index 70b836dbc1..230e3b5b64 100644 --- a/invokeai/frontend/web/public/locales/nl.json +++ b/invokeai/frontend/web/public/locales/nl.json @@ -62,7 +62,18 @@ "statusConvertingModel": "Omzetten van model", "statusModelConverted": "Model omgezet", "statusMergingModels": "Samenvoegen van modellen", - "statusMergedModels": "Modellen samengevoegd" + "statusMergedModels": "Modellen samengevoegd", + "cancel": "Annuleer", + "accept": "Akkoord", + "langPortuguese": "Português", + "pinOptionsPanel": "Zet deelscherm Opties vast", + "loading": "Bezig met laden", + "loadingInvokeAI": "Bezig met laden van Invoke AI", + "oceanTheme": "Oceaan", + "langHebrew": "עברית", + "langKorean": "한국어", + "txt2img": "Tekst naar afbeelding", + "postprocessing": "Nabewerking" }, "gallery": { "generations": "Gegenereerde afbeeldingen", @@ -301,7 +312,7 @@ "name": "Naam", "nameValidationMsg": "Geef een naam voor je model", "description": "Beschrijving", - "descriptionValidationMsg": "Voeg een beschrijving toe voor je model.", + "descriptionValidationMsg": "Voeg een beschrijving toe voor je model", "config": "Configuratie", "configValidationMsg": "Pad naar het configuratiebestand van je model.", "modelLocation": "Locatie model", @@ -391,7 +402,13 @@ "modelMergeInterpAddDifferenceHelp": "In deze stand wordt model 3 eerst van model 2 afgehaald. Wat daar uitkomt wordt gemengd met model 1, gebruikmakend van de hierboven ingestelde alfawaarde.", "inverseSigmoid": "Keer Sigmoid om", "sigmoid": "Sigmoid", - "weightedSum": "Gewogen som" + "weightedSum": "Gewogen som", + "v2_base": "v2 (512px)", + "v2_768": "v2 (768px)", + "none": "geen", + "addDifference": "Voeg verschil toe", + "scanForModels": "Scan naar modellen", + "pickModelType": "Kies modelsoort" }, "parameters": { "images": "Afbeeldingen", @@ -561,7 +578,7 @@ "autoSaveToGallery": "Bewaar automatisch naar galerij", "saveBoxRegionOnly": "Bewaar alleen tekengebied", "limitStrokesToBox": "Beperk streken tot tekenvak", - "showCanvasDebugInfo": "Toon foutopsporingsgegevens canvas", + "showCanvasDebugInfo": "Toon aanvullende canvasgegevens", "clearCanvasHistory": "Wis canvasgeschiedenis", "clearHistory": "Wis geschiedenis", "clearCanvasHistoryMessage": "Het wissen van de canvasgeschiedenis laat het huidige canvas ongemoeid, maar wist onherstelbaar de geschiedenis voor het ongedaan maken en herhalen.", @@ -587,5 +604,27 @@ "betaDarkenOutside": "Verduister buiten tekenvak", "betaLimitToBox": "Beperk tot tekenvak", "betaPreserveMasked": "Behoud masker" + }, + "accessibility": { + "exitViewer": "Stop viewer", + "zoomIn": "Zoom in", + "rotateCounterClockwise": "Draai tegen de klok in", + "modelSelect": "Modelkeuze", + "invokeProgressBar": "Voortgangsbalk Invoke", + "reset": "Herstel", + "uploadImage": "Upload afbeelding", + "previousImage": "Vorige afbeelding", + "nextImage": "Volgende afbeelding", + "useThisParameter": "Gebruik deze parameter", + "copyMetadataJson": "Kopieer metagegevens-JSON", + "zoomOut": "Zoom uit", + "rotateClockwise": "Draai met de klok mee", + "flipHorizontally": "Spiegel horizontaal", + "flipVertically": "Spiegel verticaal", + "modifyConfig": "Wijzig configuratie", + "toggleAutoscroll": "Autom. scrollen aan/uit", + "toggleLogViewer": "Logboekviewer aan/uit", + "showGallery": "Toon galerij", + "showOptionsPanel": "Toon deelscherm Opties" } } From 87e91ebc1d28c7cf0967b0f96db70f8168b988a3 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Mon, 24 Apr 2023 08:03:47 +0200 Subject: [PATCH 18/26] translationBot(ui): update translation (Spanish) Currently translated at 100.0% (512 of 512 strings) translationBot(ui): update translation (Spanish) Currently translated at 100.0% (511 of 511 strings) translationBot(ui): update translation (Spanish) Currently translated at 100.0% (506 of 506 strings) Co-authored-by: gallegonovato Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/es/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/es.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/invokeai/frontend/web/public/locales/es.json b/invokeai/frontend/web/public/locales/es.json index 9c2b6bf983..d17cefaad2 100644 --- a/invokeai/frontend/web/public/locales/es.json +++ b/invokeai/frontend/web/public/locales/es.json @@ -73,7 +73,8 @@ "postprocessing": "Tratamiento posterior", "txt2img": "De texto a imagen", "accept": "Aceptar", - "cancel": "Cancelar" + "cancel": "Cancelar", + "linear": "Lineal" }, "gallery": { "generations": "Generaciones", @@ -483,7 +484,9 @@ "negativePrompts": "Preguntas negativas", "imageToImage": "Imagen a imagen", "denoisingStrength": "Intensidad de la eliminación del ruido", - "hiresStrength": "Alta resistencia" + "hiresStrength": "Alta resistencia", + "showPreview": "Mostrar la vista previa", + "hidePreview": "Ocultar la vista previa" }, "settings": { "models": "Modelos", @@ -529,7 +532,11 @@ "metadataLoadFailed": "Error al cargar metadatos", "initialImageSet": "Imágen inicial establecida", "initialImageNotSet": "Imagen inicial no establecida", - "initialImageNotSetDesc": "Error al establecer la imágen inicial" + "initialImageNotSetDesc": "Error al establecer la imágen inicial", + "serverError": "Error en el servidor", + "disconnected": "Desconectado del servidor", + "canceled": "Procesando la cancelación", + "connected": "Conectado al servidor" }, "tooltip": { "feature": { @@ -625,6 +632,7 @@ "toggleAutoscroll": "Activar el autodesplazamiento", "toggleLogViewer": "Alternar el visor de registros", "showGallery": "Mostrar galería", - "showOptionsPanel": "Mostrar el panel de opciones" + "showOptionsPanel": "Mostrar el panel de opciones", + "menu": "Menú" } } From 4528cc8ba6df0c53e54920e2fcc0bac0eef62d28 Mon Sep 17 00:00:00 2001 From: Riccardo Giovanetti Date: Mon, 24 Apr 2023 08:03:47 +0200 Subject: [PATCH 19/26] translationBot(ui): update translation (Italian) Currently translated at 100.0% (512 of 512 strings) translationBot(ui): update translation (Italian) Currently translated at 100.0% (511 of 511 strings) translationBot(ui): update translation (Italian) Currently translated at 100.0% (506 of 506 strings) Co-authored-by: Riccardo Giovanetti Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/it.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/invokeai/frontend/web/public/locales/it.json b/invokeai/frontend/web/public/locales/it.json index 7df34173df..4ac5b6831d 100644 --- a/invokeai/frontend/web/public/locales/it.json +++ b/invokeai/frontend/web/public/locales/it.json @@ -73,7 +73,8 @@ "postprocessing": "Post Elaborazione", "txt2img": "Testo a Immagine", "accept": "Accetta", - "cancel": "Annulla" + "cancel": "Annulla", + "linear": "Lineare" }, "gallery": { "generations": "Generazioni", @@ -483,7 +484,9 @@ }, "hSymmetryStep": "Passi Simmetria Orizzontale", "vSymmetryStep": "Passi Simmetria Verticale", - "symmetry": "Simmetria" + "symmetry": "Simmetria", + "hidePreview": "Nascondi l'anteprima", + "showPreview": "Mostra l'anteprima" }, "settings": { "models": "Modelli", @@ -529,7 +532,11 @@ "metadataLoadFailed": "Impossibile caricare i metadati", "initialImageSet": "Immagine iniziale impostata", "initialImageNotSet": "Immagine iniziale non impostata", - "initialImageNotSetDesc": "Impossibile caricare l'immagine iniziale" + "initialImageNotSetDesc": "Impossibile caricare l'immagine iniziale", + "serverError": "Errore del Server", + "disconnected": "Disconnesso dal Server", + "connected": "Connesso al Server", + "canceled": "Elaborazione annullata" }, "tooltip": { "feature": { @@ -625,6 +632,7 @@ "showOptionsPanel": "Mostra il pannello opzioni", "flipVertically": "Capovolgi verticalmente", "toggleAutoscroll": "Attiva/disattiva lo scorrimento automatico", - "modifyConfig": "Modifica configurazione" + "modifyConfig": "Modifica configurazione", + "menu": "Menu" } } From 422f6967b274ceb45aa5e90d0955c36ff3976e50 Mon Sep 17 00:00:00 2001 From: mitien Date: Mon, 24 Apr 2023 08:03:48 +0200 Subject: [PATCH 20/26] translationBot(ui): update translation (Ukrainian) Currently translated at 75.8% (384 of 506 strings) translationBot(ui): update translation (Russian) Currently translated at 85.5% (433 of 506 strings) Co-authored-by: mitien Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/ Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/uk/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/ru.json | 23 ++++++++++++++++++-- invokeai/frontend/web/public/locales/uk.json | 9 +++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/invokeai/frontend/web/public/locales/ru.json b/invokeai/frontend/web/public/locales/ru.json index 0280341dee..ccb4281c78 100644 --- a/invokeai/frontend/web/public/locales/ru.json +++ b/invokeai/frontend/web/public/locales/ru.json @@ -53,7 +53,13 @@ "loading": "Загрузка", "loadingInvokeAI": "Загрузка Invoke AI", "back": "Назад", - "statusConvertingModel": "Конвертация модели" + "statusConvertingModel": "Конвертация модели", + "cancel": "Отменить", + "accept": "Принять", + "oceanTheme": "Океан", + "langUkranian": "Украинский", + "langEnglish": "Английский", + "postprocessing": "Постобработка" }, "gallery": { "generations": "Генерации", @@ -535,6 +541,19 @@ "betaPreserveMasked": "Сохранять маскируемую область" }, "accessibility": { - "modelSelect": "Выбор модели" + "modelSelect": "Выбор модели", + "uploadImage": "Загрузить изображение", + "nextImage": "Следующее изображение", + "previousImage": "Предыдущее изображение", + "zoomIn": "Приблизить", + "zoomOut": "Отдалить", + "rotateClockwise": "Повернуть по часовой стрелке", + "rotateCounterClockwise": "Повернуть против часовой стрелки", + "flipVertically": "Перевернуть вертикально", + "flipHorizontally": "Отразить горизонтально", + "toggleAutoscroll": "Включить автопрокрутку", + "toggleLogViewer": "Показать или скрыть просмотрщик логов", + "showOptionsPanel": "Показать опции", + "showGallery": "Показать галерею" } } diff --git a/invokeai/frontend/web/public/locales/uk.json b/invokeai/frontend/web/public/locales/uk.json index 044cea64a4..7b353414bb 100644 --- a/invokeai/frontend/web/public/locales/uk.json +++ b/invokeai/frontend/web/public/locales/uk.json @@ -43,7 +43,11 @@ "statusUpscaling": "Збільшення", "statusUpscalingESRGAN": "Збільшення (ESRGAN)", "statusLoadingModel": "Завантаження моделі", - "statusModelChanged": "Модель змінено" + "statusModelChanged": "Модель змінено", + "cancel": "Скасувати", + "accept": "Підтвердити", + "back": "Назад", + "postprocessing": "Постобробка" }, "gallery": { "generations": "Генерації", @@ -499,5 +503,8 @@ "betaDarkenOutside": "Затемнити зовні", "betaLimitToBox": "Обмежити виділенням", "betaPreserveMasked": "Зберiгати замасковану область" + }, + "accessibility": { + "nextImage": "Наступне зображення" } } From 44be057aa3196217168ac521556a1e2f68c4e058 Mon Sep 17 00:00:00 2001 From: System X - Files Date: Mon, 24 Apr 2023 08:03:48 +0200 Subject: [PATCH 21/26] translationBot(ui): update translation (Ukrainian) Currently translated at 100.0% (512 of 512 strings) translationBot(ui): update translation (Russian) Currently translated at 100.0% (512 of 512 strings) translationBot(ui): update translation (English) Currently translated at 100.0% (512 of 512 strings) translationBot(ui): update translation (Ukrainian) Currently translated at 100.0% (506 of 506 strings) translationBot(ui): update translation (Russian) Currently translated at 100.0% (506 of 506 strings) translationBot(ui): update translation (Russian) Currently translated at 100.0% (506 of 506 strings) Co-authored-by: System X - Files Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/en/ Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/ Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/uk/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/en.json | 2 +- invokeai/frontend/web/public/locales/ru.json | 117 ++++++++++--- invokeai/frontend/web/public/locales/uk.json | 168 ++++++++++++++++--- 3 files changed, 247 insertions(+), 40 deletions(-) diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 1b3b210b9a..247372e172 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -8,7 +8,7 @@ "nextImage": "Next Image", "useThisParameter": "Use this parameter", "copyMetadataJson": "Copy metadata JSON", - "exitViewer": "ExitViewer", + "exitViewer": "Exit Viewer", "zoomIn": "Zoom In", "zoomOut": "Zoom Out", "rotateCounterClockwise": "Rotate Counter-Clockwise", diff --git a/invokeai/frontend/web/public/locales/ru.json b/invokeai/frontend/web/public/locales/ru.json index ccb4281c78..822389d78a 100644 --- a/invokeai/frontend/web/public/locales/ru.json +++ b/invokeai/frontend/web/public/locales/ru.json @@ -9,7 +9,7 @@ "lightTheme": "Светлая", "greenTheme": "Зеленая", "img2img": "Изображение в изображение (img2img)", - "unifiedCanvas": "Универсальный холст", + "unifiedCanvas": "Единый холст", "nodes": "Ноды", "langRussian": "Русский", "nodesDesc": "Cистема генерации изображений на основе нодов (узлов) уже разрабатывается. Следите за новостями об этой замечательной функции.", @@ -59,7 +59,22 @@ "oceanTheme": "Океан", "langUkranian": "Украинский", "langEnglish": "Английский", - "postprocessing": "Постобработка" + "postprocessing": "Постобработка", + "langArabic": "Арабский", + "langSpanish": "Испанский", + "langSimplifiedChinese": "Китайский (упрощенный)", + "langDutch": "Нидерландский", + "langFrench": "Французский", + "langGerman": "Немецкий", + "langHebrew": "Иврит", + "langItalian": "Итальянский", + "langJapanese": "Японский", + "langKorean": "Корейский", + "langPolish": "Польский", + "langPortuguese": "Португальский", + "txt2img": "Текст в изображение (txt2img)", + "langBrPortuguese": "Португальский (Бразилия)", + "linear": "Линейная обработка" }, "gallery": { "generations": "Генерации", @@ -78,11 +93,11 @@ "noImagesInGallery": "Изображений нет" }, "hotkeys": { - "keyboardShortcuts": "Клавиатурные сокращения", + "keyboardShortcuts": "Горячие клавиши", "appHotkeys": "Горячие клавиши приложения", "generalHotkeys": "Общие горячие клавиши", "galleryHotkeys": "Горячие клавиши галереи", - "unifiedCanvasHotkeys": "Горячие клавиши универсального холста", + "unifiedCanvasHotkeys": "Горячие клавиши Единого холста", "invoke": { "title": "Invoke", "desc": "Сгенерировать изображение" @@ -272,12 +287,12 @@ "desc": "Сбросить вид холста" }, "previousStagingImage": { - "title": "Previous Staging Image", - "desc": "Предыдущее изображение" + "title": "Предыдущее изображение", + "desc": "Предыдущая область изображения" }, "nextStagingImage": { - "title": "Next Staging Image", - "desc": "Следующее изображение" + "title": "Следующее изображение", + "desc": "Следующая область изображения" }, "acceptStagingImage": { "title": "Принять изображение", @@ -359,7 +374,42 @@ "modelConverted": "Модель преобразована", "invokeRoot": "Каталог InvokeAI", "modelsMerged": "Модели объединены", - "mergeModels": "Объединить модели" + "mergeModels": "Объединить модели", + "scanForModels": "Просканировать модели", + "sigmoid": "Сигмоид", + "formMessageDiffusersModelLocation": "Расположение Diffusers-модели", + "modelThree": "Модель 3", + "modelMergeHeaderHelp2": "Только Diffusers-модели доступны для объединения. Если вы хотите объединить checkpoint-модели, сначала преобразуйте их в Diffusers.", + "pickModelType": "Выбрать тип модели", + "formMessageDiffusersVAELocation": "Расположение VAE", + "v1": "v1", + "convertToDiffusersSaveLocation": "Путь сохранения", + "customSaveLocation": "Пользовательский путь сохранения", + "alpha": "Альфа", + "diffusersModels": "Diffusers", + "customConfig": "Пользовательский конфиг", + "pathToCustomConfig": "Путь к пользовательскому конфигу", + "inpainting": "v1 Inpainting", + "sameFolder": "В ту же папку", + "modelOne": "Модель 1", + "mergedModelCustomSaveLocation": "Пользовательский путь", + "none": "пусто", + "addDifference": "Добавить разницу", + "vaeRepoIDValidationMsg": "Онлайн репозиторий VAE", + "convertToDiffusersHelpText2": "Этот процесс заменит вашу запись в Model Manager на версию той же модели в Diffusers.", + "custom": "Пользовательский", + "modelTwo": "Модель 2", + "mergedModelSaveLocation": "Путь сохранения", + "merge": "Объединить", + "interpolationType": "Тип интерполяции", + "modelMergeInterpAddDifferenceHelp": "В этом режиме Модель 3 сначала вычитается из Модели 2. Результирующая версия смешивается с Моделью 1 с установленным выше коэффициентом Альфа.", + "modelMergeHeaderHelp1": "Вы можете объединить до трех разных моделей, чтобы создать смешанную, соответствующую вашим потребностям.", + "modelMergeAlphaHelp": "Альфа влияет на силу смешивания моделей. Более низкие значения альфа приводят к меньшему влиянию второй модели.", + "inverseSigmoid": "Обратный Сигмоид", + "weightedSum": "Взвешенная сумма", + "safetensorModels": "SafeTensors", + "v2_768": "v2 (768px)", + "v2_base": "v2 (512px)" }, "parameters": { "images": "Изображения", @@ -386,7 +436,7 @@ "scale": "Масштаб", "otherOptions": "Другие параметры", "seamlessTiling": "Бесшовный узор", - "hiresOptim": "Высокое разрешение", + "hiresOptim": "Оптимизация High Res", "imageFit": "Уместить изображение", "codeformerFidelity": "Точность", "seamSize": "Размер шва", @@ -403,11 +453,11 @@ "infillScalingHeader": "Заполнение и масштабирование", "img2imgStrength": "Сила обработки img2img", "toggleLoopback": "Зациклить обработку", - "invoke": "Вызвать", + "invoke": "Invoke", "promptPlaceholder": "Введите запрос здесь (на английском). [исключенные токены], (более значимые)++, (менее значимые)--, swap и blend тоже доступны (смотрите Github)", "sendTo": "Отправить", "sendToImg2Img": "Отправить в img2img", - "sendToUnifiedCanvas": "Отправить на холст", + "sendToUnifiedCanvas": "Отправить на Единый холст", "copyImageToLink": "Скопировать ссылку", "downloadImage": "Скачать", "openInViewer": "Открыть в просмотрщике", @@ -419,7 +469,24 @@ "info": "Метаданные", "deleteImage": "Удалить изображение", "initialImage": "Исходное изображение", - "showOptionsPanel": "Показать панель настроек" + "showOptionsPanel": "Показать панель настроек", + "vSymmetryStep": "Шаг верт. симметрии", + "cancel": { + "immediate": "Отменить немедленно", + "schedule": "Отменить после текущей итерации", + "isScheduled": "Отмена", + "setType": "Установить тип отмены" + }, + "general": "Основное", + "hiresStrength": "Сила High Res", + "symmetry": "Симметрия", + "hSymmetryStep": "Шаг гор. симметрии", + "hidePreview": "Скрыть предпросмотр", + "imageToImage": "Изображение в изображение", + "denoisingStrength": "Сила шумоподавления", + "copyImage": "Скопировать изображение", + "negativePrompts": "Исключающий запрос", + "showPreview": "Показать предпросмотр" }, "settings": { "models": "Модели", @@ -429,10 +496,11 @@ "displayHelpIcons": "Показывать значки подсказок", "useCanvasBeta": "Показывать инструменты слева (Beta UI)", "enableImageDebugging": "Включить отладку", - "resetWebUI": "Вернуть умолчания", + "resetWebUI": "Сброс настроек Web UI", "resetWebUIDesc1": "Сброс настроек веб-интерфейса удаляет только локальный кэш браузера с вашими изображениями и настройками. Он не удаляет изображения с диска.", "resetWebUIDesc2": "Если изображения не отображаются в галерее или не работает что-то еще, пожалуйста, попробуйте сбросить настройки, прежде чем сообщать о проблеме на GitHub.", - "resetComplete": "Интерфейс сброшен. Обновите эту страницу." + "resetComplete": "Интерфейс сброшен. Обновите эту страницу.", + "useSlidersForAll": "Использовать ползунки для всех параметров" }, "toast": { "tempFoldersEmptied": "Временная папка очищена", @@ -447,7 +515,7 @@ "imageSavedToGallery": "Изображение сохранено в галерею", "canvasMerged": "Холст объединен", "sentToImageToImage": "Отправить в img2img", - "sentToUnifiedCanvas": "Отправить на холст", + "sentToUnifiedCanvas": "Отправлено на Единый холст", "parametersSet": "Параметры заданы", "parametersNotSet": "Параметры не заданы", "parametersNotSetDesc": "Не найдены метаданные изображения.", @@ -464,7 +532,11 @@ "metadataLoadFailed": "Не удалось загрузить метаданные", "initialImageSet": "Исходное изображение задано", "initialImageNotSet": "Исходное изображение не задано", - "initialImageNotSetDesc": "Не получилось загрузить исходное изображение" + "initialImageNotSetDesc": "Не получилось загрузить исходное изображение", + "serverError": "Ошибка сервера", + "disconnected": "Отключено от сервера", + "connected": "Подключено к серверу", + "canceled": "Обработка отменена" }, "tooltip": { "feature": { @@ -513,7 +585,7 @@ "autoSaveToGallery": "Автосохранение в галерее", "saveBoxRegionOnly": "Сохранять только выделение", "limitStrokesToBox": "Ограничить штрихи выделением", - "showCanvasDebugInfo": "Показать отладку холста", + "showCanvasDebugInfo": "Показать доп. информацию о холсте", "clearCanvasHistory": "Очистить историю холста", "clearHistory": "Очистить историю", "clearCanvasHistoryMessage": "Очистка истории холста оставляет текущий холст нетронутым, но удаляет историю отмен и повторов.", @@ -554,6 +626,13 @@ "toggleAutoscroll": "Включить автопрокрутку", "toggleLogViewer": "Показать или скрыть просмотрщик логов", "showOptionsPanel": "Показать опции", - "showGallery": "Показать галерею" + "showGallery": "Показать галерею", + "invokeProgressBar": "Индикатор выполнения", + "reset": "Сброс", + "modifyConfig": "Изменить конфиг", + "useThisParameter": "Использовать этот параметр", + "copyMetadataJson": "Скопировать метаданные JSON", + "exitViewer": "Закрыть просмотрщик", + "menu": "Меню" } } diff --git a/invokeai/frontend/web/public/locales/uk.json b/invokeai/frontend/web/public/locales/uk.json index 7b353414bb..8261aa82e0 100644 --- a/invokeai/frontend/web/public/locales/uk.json +++ b/invokeai/frontend/web/public/locales/uk.json @@ -16,9 +16,9 @@ "postProcessing": "Постобробка", "postProcessDesc1": "Invoke AI пропонує широкий спектр функцій постобробки. Збільшення зображення (upscale) та відновлення облич вже доступні в інтерфейсі. Отримайте доступ до них з меню 'Додаткові параметри' на вкладках 'Зображення із тексту' та 'Зображення із зображення'. Обробляйте зображення безпосередньо, використовуючи кнопки дій із зображеннями над поточним зображенням або в режимі перегляду.", "postProcessDesc2": "Найближчим часом буде випущено спеціальний інтерфейс для більш сучасних процесів постобробки.", - "postProcessDesc3": "Інтерфейс командного рядка Invoke AI пропонує різні інші функції, включаючи збільшення Embiggen", + "postProcessDesc3": "Інтерфейс командного рядка Invoke AI пропонує різні інші функції, включаючи збільшення Embiggen.", "training": "Навчання", - "trainingDesc1": "Спеціальний інтерфейс для навчання власних моделей з використанням Textual Inversion та Dreambooth", + "trainingDesc1": "Спеціальний інтерфейс для навчання власних моделей з використанням Textual Inversion та Dreambooth.", "trainingDesc2": "InvokeAI вже підтримує навчання моделей за допомогою TI, через інтерфейс командного рядка.", "upload": "Завантажити", "close": "Закрити", @@ -47,7 +47,34 @@ "cancel": "Скасувати", "accept": "Підтвердити", "back": "Назад", - "postprocessing": "Постобробка" + "postprocessing": "Постобробка", + "statusModelConverted": "Модель сконвертована", + "statusMergingModels": "Злиття моделей", + "loading": "Завантаження", + "loadingInvokeAI": "Завантаження Invoke AI", + "langHebrew": "Іврит", + "langKorean": "Корейська", + "langPortuguese": "Португальська", + "pinOptionsPanel": "Закріпити панель налаштувань", + "oceanTheme": "Океан", + "langArabic": "Арабська", + "langSimplifiedChinese": "Китайська (спрощена)", + "langSpanish": "Іспанська", + "langEnglish": "Англійська", + "langGerman": "Німецька", + "langItalian": "Італійська", + "langJapanese": "Японська", + "langPolish": "Польська", + "langBrPortuguese": "Португальська (Бразилія)", + "langRussian": "Російська", + "githubLabel": "Github", + "txt2img": "Текст в зображення (txt2img)", + "discordLabel": "Discord", + "langDutch": "Голландська", + "langFrench": "Французька", + "statusMergedModels": "Моделі об'єднані", + "statusConvertingModel": "Конвертація моделі", + "linear": "Лінійна обробка" }, "gallery": { "generations": "Генерації", @@ -288,15 +315,15 @@ "description": "Опис", "descriptionValidationMsg": "Введіть опис моделі", "config": "Файл конфігурації", - "configValidationMsg": "Шлях до файлу конфігурації", + "configValidationMsg": "Шлях до файлу конфігурації.", "modelLocation": "Розташування моделі", - "modelLocationValidationMsg": "Шлях до файлу з моделлю", + "modelLocationValidationMsg": "Шлях до файлу з моделлю.", "vaeLocation": "Розтышування VAE", - "vaeLocationValidationMsg": "Шлях до VAE", + "vaeLocationValidationMsg": "Шлях до VAE.", "width": "Ширина", - "widthValidationMsg": "Початкова ширина зображень", + "widthValidationMsg": "Початкова ширина зображень.", "height": "Висота", - "heightValidationMsg": "Початкова висота зображень", + "heightValidationMsg": "Початкова висота зображень.", "addModel": "Додати модель", "updateModel": "Оновити модель", "availableModels": "Доступні моделі", @@ -323,7 +350,66 @@ "deleteModel": "Видалити модель", "deleteConfig": "Видалити конфігурацію", "deleteMsg1": "Ви точно хочете видалити модель із InvokeAI?", - "deleteMsg2": "Це не призведе до видалення файлу моделі з диску. Позніше ви можете додати його знову." + "deleteMsg2": "Це не призведе до видалення файлу моделі з диску. Позніше ви можете додати його знову.", + "allModels": "Усі моделі", + "diffusersModels": "Diffusers", + "scanForModels": "Сканувати моделі", + "convert": "Конвертувати", + "convertToDiffusers": "Конвертувати в Diffusers", + "formMessageDiffusersVAELocationDesc": "Якщо не надано, InvokeAI буде шукати файл VAE в розташуванні моделі, вказаній вище.", + "convertToDiffusersHelpText3": "Файл моделі на диску НЕ буде видалено або змінено. Ви можете знову додати його в Model Manager, якщо потрібно.", + "customConfig": "Користувальницький конфіг", + "invokeRoot": "Каталог InvokeAI", + "custom": "Користувальницький", + "modelTwo": "Модель 2", + "modelThree": "Модель 3", + "mergedModelName": "Назва об'єднаної моделі", + "alpha": "Альфа", + "interpolationType": "Тип інтерполяції", + "mergedModelSaveLocation": "Шлях збереження", + "mergedModelCustomSaveLocation": "Користувальницький шлях", + "invokeAIFolder": "Каталог InvokeAI", + "ignoreMismatch": "Ігнорувати невідповідності між вибраними моделями", + "modelMergeHeaderHelp2": "Тільки Diffusers-моделі доступні для об'єднання. Якщо ви хочете об'єднати checkpoint-моделі, спочатку перетворіть їх на Diffusers.", + "checkpointModels": "Checkpoints", + "repo_id": "ID репозиторію", + "v2_base": "v2 (512px)", + "repoIDValidationMsg": "Онлайн-репозиторій моделі", + "formMessageDiffusersModelLocationDesc": "Вкажіть хоча б одне.", + "formMessageDiffusersModelLocation": "Шлях до Diffusers-моделі", + "v2_768": "v2 (768px)", + "formMessageDiffusersVAELocation": "Шлях до VAE", + "convertToDiffusersHelpText5": "Переконайтеся, що у вас достатньо місця на диску. Моделі зазвичай займають від 4 до 7 Гб.", + "convertToDiffusersSaveLocation": "Шлях збереження", + "v1": "v1", + "convertToDiffusersHelpText6": "Ви хочете перетворити цю модель?", + "inpainting": "v1 Inpainting", + "modelConverted": "Модель перетворено", + "sameFolder": "У ту ж папку", + "statusConverting": "Перетворення", + "merge": "Об'єднати", + "mergeModels": "Об'єднати моделі", + "modelOne": "Модель 1", + "sigmoid": "Сігмоїд", + "weightedSum": "Зважена сума", + "none": "пусто", + "addDifference": "Додати різницю", + "pickModelType": "Вибрати тип моделі", + "convertToDiffusersHelpText4": "Це одноразова дія. Вона може зайняти від 30 до 60 секунд в залежності від характеристик вашого комп'ютера.", + "pathToCustomConfig": "Шлях до конфігу користувача", + "safetensorModels": "SafeTensors", + "addCheckpointModel": "Додати модель Checkpoint/Safetensor", + "addDiffuserModel": "Додати Diffusers", + "vaeRepoID": "ID репозиторію VAE", + "vaeRepoIDValidationMsg": "Онлайн-репозиторій VAE", + "modelMergeInterpAddDifferenceHelp": "У цьому режимі Модель 3 спочатку віднімається з Моделі 2. Результуюча версія змішується з Моделью 1 із встановленим вище коефіцієнтом Альфа.", + "customSaveLocation": "Користувальницький шлях збереження", + "modelMergeAlphaHelp": "Альфа впливає силу змішування моделей. Нижчі значення альфа призводять до меншого впливу другої моделі.", + "convertToDiffusersHelpText1": "Ця модель буде конвертована в формат 🧨 Diffusers.", + "convertToDiffusersHelpText2": "Цей процес замінить ваш запис в Model Manager на версію тієї ж моделі в Diffusers.", + "modelsMerged": "Моделі об'єднані", + "modelMergeHeaderHelp1": "Ви можете об'єднати до трьох різних моделей, щоб створити змішану, що відповідає вашим потребам.", + "inverseSigmoid": "Зворотній Сігмоїд" }, "parameters": { "images": "Зображення", @@ -350,7 +436,7 @@ "scale": "Масштаб", "otherOptions": "інші параметри", "seamlessTiling": "Безшовний узор", - "hiresOptim": "Висока роздільна здатність", + "hiresOptim": "Оптимізація High Res", "imageFit": "Вмістити зображення", "codeformerFidelity": "Точність", "seamSize": "Размір шву", @@ -383,7 +469,24 @@ "info": "Метадані", "deleteImage": "Видалити зображення", "initialImage": "Початкове зображення", - "showOptionsPanel": "Показати панель налаштувань" + "showOptionsPanel": "Показати панель налаштувань", + "general": "Основне", + "cancel": { + "immediate": "Скасувати негайно", + "schedule": "Скасувати після поточної ітерації", + "isScheduled": "Відміна", + "setType": "Встановити тип скасування" + }, + "vSymmetryStep": "Крок верт. симетрії", + "hiresStrength": "Сила High Res", + "hidePreview": "Сховати попередній перегляд", + "showPreview": "Показати попередній перегляд", + "imageToImage": "Зображення до зображення", + "denoisingStrength": "Сила шумоподавлення", + "copyImage": "Копіювати зображення", + "symmetry": "Симетрія", + "hSymmetryStep": "Крок гор. симетрії", + "negativePrompts": "Виключний запит" }, "settings": { "models": "Моделі", @@ -396,7 +499,8 @@ "resetWebUI": "Повернути початкові", "resetWebUIDesc1": "Скидання настройок веб-інтерфейсу видаляє лише локальний кеш браузера з вашими зображеннями та налаштуваннями. Це не призводить до видалення зображень з диску.", "resetWebUIDesc2": "Якщо зображення не відображаються в галереї або не працює ще щось, спробуйте скинути налаштування, перш ніж повідомляти про проблему на GitHub.", - "resetComplete": "Інтерфейс скинуто. Оновіть цю сторінку." + "resetComplete": "Інтерфейс скинуто. Оновіть цю сторінку.", + "useSlidersForAll": "Використовувати повзунки для всіх параметрів" }, "toast": { "tempFoldersEmptied": "Тимчасова папка очищена", @@ -414,21 +518,25 @@ "sentToUnifiedCanvas": "Надіслати на полотно", "parametersSet": "Параметри задані", "parametersNotSet": "Параметри не задані", - "parametersNotSetDesc": "Не знайдені метадані цього зображення", + "parametersNotSetDesc": "Не знайдені метадані цього зображення.", "parametersFailed": "Проблема із завантаженням параметрів", - "parametersFailedDesc": "Неможливо завантажити початкове зображення", + "parametersFailedDesc": "Неможливо завантажити початкове зображення.", "seedSet": "Сід заданий", "seedNotSet": "Сід не заданий", - "seedNotSetDesc": "Не вдалося знайти сід для зображення", + "seedNotSetDesc": "Не вдалося знайти сід для зображення.", "promptSet": "Запит заданий", "promptNotSet": "Запит не заданий", - "promptNotSetDesc": "Не вдалося знайти запит для зображення", + "promptNotSetDesc": "Не вдалося знайти запит для зображення.", "upscalingFailed": "Збільшення не вдалося", "faceRestoreFailed": "Відновлення облич не вдалося", "metadataLoadFailed": "Не вдалося завантажити метадані", "initialImageSet": "Початкове зображення задане", "initialImageNotSet": "Початкове зображення не задане", - "initialImageNotSetDesc": "Не вдалося завантажити початкове зображення" + "initialImageNotSetDesc": "Не вдалося завантажити початкове зображення", + "serverError": "Помилка сервера", + "disconnected": "Відключено від сервера", + "connected": "Підключено до сервера", + "canceled": "Обробку скасовано" }, "tooltip": { "feature": { @@ -477,10 +585,10 @@ "autoSaveToGallery": "Автозбереження до галереї", "saveBoxRegionOnly": "Зберiгати тiльки видiлення", "limitStrokesToBox": "Обмежити штрихи виділенням", - "showCanvasDebugInfo": "Показати налаштування полотна", + "showCanvasDebugInfo": "Показати дод. інформацію про полотно", "clearCanvasHistory": "Очистити iсторiю полотна", "clearHistory": "Очистити iсторiю", - "clearCanvasHistoryMessage": "Очищення історії полотна залишає поточне полотно незайманим, але видаляє історію скасування та повтору", + "clearCanvasHistoryMessage": "Очищення історії полотна залишає поточне полотно незайманим, але видаляє історію скасування та повтору.", "clearCanvasHistoryConfirm": "Ви впевнені, що хочете очистити історію полотна?", "emptyTempImageFolder": "Очистити тимчасову папку", "emptyFolder": "Очистити папку", @@ -505,6 +613,26 @@ "betaPreserveMasked": "Зберiгати замасковану область" }, "accessibility": { - "nextImage": "Наступне зображення" + "nextImage": "Наступне зображення", + "modelSelect": "Вибір моделі", + "invokeProgressBar": "Індикатор виконання", + "reset": "Скинути", + "uploadImage": "Завантажити зображення", + "useThisParameter": "Використовувати цей параметр", + "exitViewer": "Вийти з переглядача", + "zoomIn": "Збільшити", + "zoomOut": "Зменшити", + "rotateCounterClockwise": "Обертати проти годинникової стрілки", + "rotateClockwise": "Обертати за годинниковою стрілкою", + "toggleAutoscroll": "Увімкнути автопрокручування", + "toggleLogViewer": "Показати або приховати переглядач журналів", + "showGallery": "Показати галерею", + "previousImage": "Попереднє зображення", + "copyMetadataJson": "Скопіювати метадані JSON", + "flipVertically": "Перевернути по вертикалі", + "flipHorizontally": "Відобразити по горизонталі", + "showOptionsPanel": "Показати опції", + "modifyConfig": "Змінити конфігурацію", + "menu": "Меню" } } From 16f6ee04d06223437e3c485a0a1cbe41a6f65e86 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Mon, 24 Apr 2023 08:03:49 +0200 Subject: [PATCH 22/26] translationBot(ui): update translation (German) Currently translated at 81.8% (414 of 506 strings) translationBot(ui): update translation (German) Currently translated at 80.8% (409 of 506 strings) Co-authored-by: Alexander Eichhorn Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/de/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/de.json | 47 ++++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/invokeai/frontend/web/public/locales/de.json b/invokeai/frontend/web/public/locales/de.json index dc78a6446e..fd4c3281b6 100644 --- a/invokeai/frontend/web/public/locales/de.json +++ b/invokeai/frontend/web/public/locales/de.json @@ -18,7 +18,7 @@ "training": "Training", "trainingDesc1": "Ein spezieller Arbeitsablauf zum Trainieren Ihrer eigenen Embeddings und Checkpoints mit Textual Inversion und Dreambooth über die Weboberfläche.", "trainingDesc2": "InvokeAI unterstützt bereits das Training von benutzerdefinierten Embeddings mit Textual Inversion unter Verwendung des Hauptskripts.", - "upload": "Upload", + "upload": "Hochladen", "close": "Schließen", "load": "Laden", "statusConnected": "Verbunden", @@ -41,12 +41,34 @@ "statusUpscaling": "Hochskalierung", "statusUpscalingESRGAN": "Hochskalierung (ESRGAN)", "statusLoadingModel": "Laden des Modells", - "statusModelChanged": "Modell Geändert" + "statusModelChanged": "Modell Geändert", + "cancel": "Abbruch", + "accept": "Annehmen", + "back": "Zurück", + "langEnglish": "Englisch", + "langDutch": "Niederländisch", + "langFrench": "Französisch", + "oceanTheme": "Ozean", + "langItalian": "Italienisch", + "langPortuguese": "Portogisisch", + "langRussian": "Russisch", + "langUkranian": "Ukrainisch", + "hotkeysLabel": "Hotkeys", + "githubLabel": "Github", + "discordLabel": "Discord", + "txt2img": "Text zu Bild", + "postprocessing": "Nachbearbeitung", + "langPolish": "Polnisch", + "langJapanese": "Japanisch", + "langArabic": "Arabisch", + "langKorean": "Koreanisch", + "langHebrew": "Hebräisch", + "langSpanish": "Spanisch" }, "gallery": { "generations": "Erzeugungen", "showGenerations": "Zeige Erzeugnisse", - "uploads": "Uploads", + "uploads": "Hochgelades", "showUploads": "Zeige Uploads", "galleryImageSize": "Bildgröße", "galleryImageResetSize": "Größe zurücksetzen", @@ -491,6 +513,23 @@ "betaPreserveMasked": "Maskiertes bewahren" }, "accessibility": { - "modelSelect": "Model Auswahl" + "modelSelect": "Model Auswahl", + "uploadImage": "Bild hochladen", + "previousImage": "Voriges Bild", + "useThisParameter": "Benutze diesen Parameter", + "copyMetadataJson": "Kopiere metadata JSON", + "zoomIn": "Vergrößern", + "rotateClockwise": "Im Uhrzeigersinn drehen", + "flipHorizontally": "Horizontal drehen", + "flipVertically": "Vertikal drehen", + "modifyConfig": "Optionen einstellen", + "toggleAutoscroll": "Auroscroll ein/ausschalten", + "toggleLogViewer": "Log Betrachter ein/ausschalten", + "showGallery": "Zeige Galerie", + "showOptionsPanel": "Zeige Optionen", + "reset": "Zurücksetzen", + "nextImage": "Nächstes Bild", + "zoomOut": "Verkleinern", + "rotateCounterClockwise": "Gegen den Uhrzeigersinn verdrehen" } } From a84b5b168f11dfff898eb671dff08a08fbdc5a73 Mon Sep 17 00:00:00 2001 From: figgefigge Date: Mon, 24 Apr 2023 08:03:49 +0200 Subject: [PATCH 23/26] translationBot(ui): update translation (Swedish) Currently translated at 34.7% (176 of 506 strings) translationBot(ui): added translation (Swedish) Co-authored-by: figgefigge Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/sv/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/sv.json | 254 +++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 invokeai/frontend/web/public/locales/sv.json diff --git a/invokeai/frontend/web/public/locales/sv.json b/invokeai/frontend/web/public/locales/sv.json new file mode 100644 index 0000000000..da2266135d --- /dev/null +++ b/invokeai/frontend/web/public/locales/sv.json @@ -0,0 +1,254 @@ +{ + "accessibility": { + "copyMetadataJson": "Kopiera metadata JSON", + "zoomIn": "Zooma in", + "exitViewer": "Avslutningsvisare", + "modelSelect": "Välj modell", + "uploadImage": "Ladda upp bild", + "invokeProgressBar": "Invoke förloppsmätare", + "nextImage": "Nästa bild", + "toggleAutoscroll": "Växla automatisk rullning", + "flipHorizontally": "Vänd vågrätt", + "flipVertically": "Vänd lodrätt", + "zoomOut": "Zooma ut", + "toggleLogViewer": "Växla logvisare", + "reset": "Starta om", + "previousImage": "Föregående bild", + "useThisParameter": "Använd denna parametern", + "showGallery": "Visa galleri", + "rotateCounterClockwise": "Rotera moturs", + "rotateClockwise": "Rotera medurs", + "modifyConfig": "Ändra konfiguration", + "showOptionsPanel": "Visa inställningspanelen" + }, + "common": { + "hotkeysLabel": "Snabbtangenter", + "reportBugLabel": "Rapportera bugg", + "githubLabel": "Github", + "discordLabel": "Discord", + "settingsLabel": "Inställningar", + "darkTheme": "Mörk", + "lightTheme": "Ljus", + "greenTheme": "Grön", + "oceanTheme": "Hav", + "langEnglish": "Engelska", + "langDutch": "Nederländska", + "langFrench": "Franska", + "langGerman": "Tyska", + "langItalian": "Italienska", + "langArabic": "العربية", + "langHebrew": "עברית", + "langPolish": "Polski", + "langPortuguese": "Português", + "langBrPortuguese": "Português do Brasil", + "langSimplifiedChinese": "简体中文", + "langJapanese": "日本語", + "langKorean": "한국어", + "langRussian": "Русский", + "unifiedCanvas": "Förenad kanvas", + "nodesDesc": "Ett nodbaserat system för bildgenerering är under utveckling. Håll utkik för uppdateringar om denna fantastiska funktion.", + "langUkranian": "Украї́нська", + "langSpanish": "Español", + "postProcessDesc2": "Ett dedikerat användargränssnitt kommer snart att släppas för att underlätta mer avancerade arbetsflöden av efterbehandling.", + "trainingDesc1": "Ett dedikerat arbetsflöde för träning av dina egna inbäddningar och kontrollpunkter genom Textual Inversion eller Dreambooth från webbgränssnittet.", + "trainingDesc2": "InvokeAI stöder redan träning av anpassade inbäddningar med hjälp av Textual Inversion genom huvudscriptet.", + "upload": "Ladda upp", + "close": "Stäng", + "cancel": "Avbryt", + "accept": "Acceptera", + "statusDisconnected": "Frånkopplad", + "statusGeneratingTextToImage": "Genererar text till bild", + "statusGeneratingImageToImage": "Genererar Bild till bild", + "statusGeneratingInpainting": "Genererar Måla i", + "statusGenerationComplete": "Generering klar", + "statusModelConverted": "Modell konverterad", + "statusMergingModels": "Sammanfogar modeller", + "pinOptionsPanel": "Nåla fast inställningspanelen", + "loading": "Laddar", + "loadingInvokeAI": "Laddar Invoke AI", + "statusRestoringFaces": "Återskapar ansikten", + "languagePickerLabel": "Språkväljare", + "themeLabel": "Tema", + "txt2img": "Text till bild", + "nodes": "Noder", + "img2img": "Bild till bild", + "postprocessing": "Efterbehandling", + "postProcessing": "Efterbehandling", + "load": "Ladda", + "training": "Träning", + "postProcessDesc1": "Invoke AI erbjuder ett brett utbud av efterbehandlingsfunktioner. Uppskalning och ansiktsåterställning finns redan tillgängligt i webbgränssnittet. Du kommer åt dem ifrån Avancerade inställningar-menyn under Bild till bild-fliken. Du kan också behandla bilder direkt genom att använda knappen bildåtgärder ovanför nuvarande bild eller i bildvisaren.", + "postProcessDesc3": "Invoke AI's kommandotolk erbjuder många olika funktioner, bland annat \"Förstora\".", + "statusGenerating": "Genererar", + "statusError": "Fel", + "back": "Bakåt", + "statusConnected": "Ansluten", + "statusPreparing": "Förbereder", + "statusProcessingCanceled": "Bearbetning avbruten", + "statusProcessingComplete": "Bearbetning färdig", + "statusGeneratingOutpainting": "Genererar Fyll ut", + "statusIterationComplete": "Itterering klar", + "statusSavingImage": "Sparar bild", + "statusRestoringFacesGFPGAN": "Återskapar ansikten (GFPGAN)", + "statusRestoringFacesCodeFormer": "Återskapar ansikten (CodeFormer)", + "statusUpscaling": "Skala upp", + "statusUpscalingESRGAN": "Uppskalning (ESRGAN)", + "statusModelChanged": "Modell ändrad", + "statusLoadingModel": "Laddar modell", + "statusConvertingModel": "Konverterar modell", + "statusMergedModels": "Modeller sammanfogade" + }, + "gallery": { + "generations": "Generationer", + "showGenerations": "Visa generationer", + "uploads": "Uppladdningar", + "showUploads": "Visa uppladdningar", + "galleryImageSize": "Bildstorlek", + "allImagesLoaded": "Alla bilder laddade", + "loadMore": "Ladda mer", + "galleryImageResetSize": "Återställ storlek", + "gallerySettings": "Galleriinställningar", + "maintainAspectRatio": "Behåll bildförhållande", + "pinGallery": "Nåla fast galleri", + "noImagesInGallery": "Inga bilder i galleriet", + "autoSwitchNewImages": "Ändra automatiskt till nya bilder", + "singleColumnLayout": "Enkolumnslayout" + }, + "hotkeys": { + "generalHotkeys": "Allmänna snabbtangenter", + "galleryHotkeys": "Gallerisnabbtangenter", + "unifiedCanvasHotkeys": "Snabbtangenter för sammanslagskanvas", + "invoke": { + "title": "Anropa", + "desc": "Genererar en bild" + }, + "cancel": { + "title": "Avbryt", + "desc": "Avbryt bildgenerering" + }, + "focusPrompt": { + "desc": "Fokusera området för promptinmatning", + "title": "Fokusprompt" + }, + "pinOptions": { + "desc": "Nåla fast alternativpanelen", + "title": "Nåla fast alternativ" + }, + "toggleOptions": { + "title": "Växla inställningar", + "desc": "Öppna och stäng alternativpanelen" + }, + "toggleViewer": { + "title": "Växla visaren", + "desc": "Öppna och stäng bildvisaren" + }, + "toggleGallery": { + "title": "Växla galleri", + "desc": "Öppna eller stäng galleribyrån" + }, + "maximizeWorkSpace": { + "title": "Maximera arbetsyta", + "desc": "Stäng paneler och maximera arbetsyta" + }, + "changeTabs": { + "title": "Växla flik", + "desc": "Byt till en annan arbetsyta" + }, + "consoleToggle": { + "title": "Växla konsol", + "desc": "Öppna och stäng konsol" + }, + "setSeed": { + "desc": "Använd seed för nuvarande bild", + "title": "välj seed" + }, + "setParameters": { + "title": "Välj parametrar", + "desc": "Använd alla parametrar från nuvarande bild" + }, + "setPrompt": { + "desc": "Använd prompt för nuvarande bild", + "title": "Välj prompt" + }, + "restoreFaces": { + "title": "Återskapa ansikten", + "desc": "Återskapa nuvarande bild" + }, + "upscale": { + "title": "Skala upp", + "desc": "Skala upp nuvarande bild" + }, + "showInfo": { + "title": "Visa info", + "desc": "Visa metadata för nuvarande bild" + }, + "sendToImageToImage": { + "title": "Skicka till Bild till bild", + "desc": "Skicka nuvarande bild till Bild till bild" + }, + "deleteImage": { + "title": "Radera bild", + "desc": "Radera nuvarande bild" + }, + "closePanels": { + "title": "Stäng paneler", + "desc": "Stäng öppna paneler" + }, + "previousImage": { + "title": "Föregående bild", + "desc": "Visa föregående bild" + }, + "nextImage": { + "title": "Nästa bild", + "desc": "Visa nästa bild" + }, + "toggleGalleryPin": { + "title": "Växla gallerinål", + "desc": "Nålar fast eller nålar av galleriet i gränssnittet" + }, + "increaseGalleryThumbSize": { + "title": "Förstora galleriets bildstorlek", + "desc": "Förstora miniatyrbildernas storlek" + }, + "decreaseGalleryThumbSize": { + "title": "Minska gelleriets bildstorlek", + "desc": "Minska miniatyrbildernas storlek i galleriet" + }, + "decreaseBrushSize": { + "desc": "Förminska storleken på kanvas- pensel eller suddgummi", + "title": "Minska penselstorlek" + }, + "increaseBrushSize": { + "title": "Öka penselstorlek", + "desc": "Öka stoleken på kanvas- pensel eller suddgummi" + }, + "increaseBrushOpacity": { + "title": "Öka penselns opacitet", + "desc": "Öka opaciteten för kanvaspensel" + }, + "decreaseBrushOpacity": { + "desc": "Minska kanvaspenselns opacitet", + "title": "Minska penselns opacitet" + }, + "moveTool": { + "title": "Flytta", + "desc": "Tillåt kanvasnavigation" + }, + "fillBoundingBox": { + "title": "Fyll ram", + "desc": "Fyller ramen med pensels färg" + }, + "keyboardShortcuts": "Snabbtangenter", + "appHotkeys": "Appsnabbtangenter", + "selectBrush": { + "desc": "Välj kanvaspensel", + "title": "Välj pensel" + }, + "selectEraser": { + "desc": "Välj kanvassuddgummi", + "title": "Välj suddgummi" + }, + "eraseBoundingBox": { + "title": "Ta bort ram" + } + } +} From ef605cd76caaf57c28598aebae3503f03da2cb76 Mon Sep 17 00:00:00 2001 From: Fabian Bahl Date: Mon, 24 Apr 2023 08:03:50 +0200 Subject: [PATCH 24/26] translationBot(ui): update translation (German) Currently translated at 81.8% (414 of 506 strings) Co-authored-by: Fabian Bahl Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/de/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/de.json | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/invokeai/frontend/web/public/locales/de.json b/invokeai/frontend/web/public/locales/de.json index fd4c3281b6..cff09d46bb 100644 --- a/invokeai/frontend/web/public/locales/de.json +++ b/invokeai/frontend/web/public/locales/de.json @@ -53,7 +53,7 @@ "langPortuguese": "Portogisisch", "langRussian": "Russisch", "langUkranian": "Ukrainisch", - "hotkeysLabel": "Hotkeys", + "hotkeysLabel": "Tastenkombinationen", "githubLabel": "Github", "discordLabel": "Discord", "txt2img": "Text zu Bild", @@ -334,7 +334,11 @@ "deleteModel": "Model löschen", "deleteConfig": "Konfiguration löschen", "deleteMsg1": "Möchten Sie diesen Model-Eintrag wirklich aus InvokeAI löschen?", - "deleteMsg2": "Dadurch wird die Modellprüfpunktdatei nicht von Ihrer Festplatte gelöscht. Sie können sie bei Bedarf erneut hinzufügen." + "deleteMsg2": "Dadurch wird die Modellprüfpunktdatei nicht von Ihrer Festplatte gelöscht. Sie können sie bei Bedarf erneut hinzufügen.", + "customConfig": "Benutzerdefinierte Konfiguration", + "invokeRoot": "InvokeAI Ordner", + "formMessageDiffusersVAELocationDesc": "Falls nicht angegeben, sucht InvokeAI nach der VAE-Datei innerhalb des oben angegebenen Modell Speicherortes.", + "checkpointModels": "Kontrollpunkte" }, "parameters": { "images": "Bilder", @@ -392,7 +396,10 @@ "useInitImg": "Ausgangsbild verwenden", "deleteImage": "Bild löschen", "initialImage": "Ursprüngliches Bild", - "showOptionsPanel": "Optionsleiste zeigen" + "showOptionsPanel": "Optionsleiste zeigen", + "cancel": { + "setType": "Abbruchart festlegen" + } }, "settings": { "displayInProgress": "Bilder in Bearbeitung anzeigen", From 2b58ce4ae4da503dcc262ddf74ed924f64aecd12 Mon Sep 17 00:00:00 2001 From: Patrick Tien Date: Mon, 24 Apr 2023 08:03:50 +0200 Subject: [PATCH 25/26] translationBot(ui): update translation (Chinese (Simplified)) Currently translated at 75.0% (380 of 506 strings) Co-authored-by: Patrick Tien Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/zh_Hans/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/zh_CN.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/invokeai/frontend/web/public/locales/zh_CN.json b/invokeai/frontend/web/public/locales/zh_CN.json index b23ac8cc99..d4d7746926 100644 --- a/invokeai/frontend/web/public/locales/zh_CN.json +++ b/invokeai/frontend/web/public/locales/zh_CN.json @@ -481,5 +481,22 @@ "betaDarkenOutside": "暗化外部区域", "betaLimitToBox": "限制在框内", "betaPreserveMasked": "保留遮罩层" + }, + "accessibility": { + "modelSelect": "模型选择", + "invokeProgressBar": "Invoke 进度条", + "reset": "重置", + "nextImage": "下一张图片", + "useThisParameter": "使用此参数", + "uploadImage": "上传图片", + "previousImage": "上一张图片", + "copyMetadataJson": "复制JSON元数据", + "exitViewer": "退出视口(ExitViewer)", + "zoomIn": "放大", + "zoomOut": "缩小", + "rotateCounterClockwise": "逆时针旋转", + "rotateClockwise": "顺时针旋转", + "flipHorizontally": "水平翻转", + "flipVertically": "垂直翻转" } } From 8044d1b840a4b0b532b568bd8671deb638d3670a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ismail=20ihsan=20b=C3=BClb=C3=BCl?= Date: Mon, 24 Apr 2023 08:03:51 +0200 Subject: [PATCH 26/26] translationBot(ui): update translation (Turkish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 11.3% (58 of 512 strings) translationBot(ui): added translation (Turkish) Co-authored-by: ismail ihsan bülbül Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/tr/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/tr.json | 64 ++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 invokeai/frontend/web/public/locales/tr.json diff --git a/invokeai/frontend/web/public/locales/tr.json b/invokeai/frontend/web/public/locales/tr.json new file mode 100644 index 0000000000..316908b4a9 --- /dev/null +++ b/invokeai/frontend/web/public/locales/tr.json @@ -0,0 +1,64 @@ +{ + "accessibility": { + "invokeProgressBar": "Invoke ilerleme durumu", + "nextImage": "Sonraki Resim", + "useThisParameter": "Kullanıcı parametreleri", + "copyMetadataJson": "Metadata verilerini kopyala (JSON)", + "exitViewer": "Görüntüleme Modundan Çık", + "zoomIn": "Yakınlaştır", + "zoomOut": "Uzaklaştır", + "rotateCounterClockwise": "Döndür (Saat yönünün tersine)", + "rotateClockwise": "Döndür (Saat yönünde)", + "flipHorizontally": "Yatay Çevir", + "flipVertically": "Dikey Çevir", + "modifyConfig": "Ayarları Değiştir", + "toggleAutoscroll": "Otomatik kaydırmayı aç/kapat", + "toggleLogViewer": "Günlük Görüntüleyici Aç/Kapa", + "showOptionsPanel": "Ayarlar Panelini Göster", + "modelSelect": "Model Seçin", + "reset": "Sıfırla", + "uploadImage": "Resim Yükle", + "previousImage": "Önceki Resim", + "menu": "Menü", + "showGallery": "Galeriyi Göster" + }, + "common": { + "hotkeysLabel": "Kısayol Tuşları", + "themeLabel": "Tema", + "languagePickerLabel": "Dil Seçimi", + "reportBugLabel": "Hata Bildir", + "githubLabel": "Github", + "discordLabel": "Discord", + "settingsLabel": "Ayarlar", + "darkTheme": "Karanlık Tema", + "lightTheme": "Aydınlık Tema", + "greenTheme": "Yeşil Tema", + "oceanTheme": "Okyanus Tema", + "langArabic": "Arapça", + "langEnglish": "İngilizce", + "langDutch": "Hollandaca", + "langFrench": "Fransızca", + "langGerman": "Almanca", + "langItalian": "İtalyanca", + "langJapanese": "Japonca", + "langPolish": "Lehçe", + "langPortuguese": "Portekizce", + "langBrPortuguese": "Portekizcr (Brezilya)", + "langRussian": "Rusça", + "langSimplifiedChinese": "Çince (Basit)", + "langUkranian": "Ukraynaca", + "langSpanish": "İspanyolca", + "txt2img": "Metinden Resime", + "img2img": "Resimden Metine", + "linear": "Çizgisel", + "nodes": "Düğümler", + "postprocessing": "İşlem Sonrası", + "postProcessing": "İşlem Sonrası", + "postProcessDesc2": "Daha gelişmiş özellikler için ve iş akışını kolaylaştırmak için özel bir kullanıcı arayüzü çok yakında yayınlanacaktır.", + "postProcessDesc3": "Invoke AI komut satırı arayüzü, bir çok yeni özellik sunmaktadır.", + "langKorean": "Korece", + "unifiedCanvas": "Akıllı Tuval", + "nodesDesc": "Görüntülerin oluşturulmasında hazırladığımız yeni bir sistem geliştirme aşamasındadır. Bu harika özellikler ve çok daha fazlası için bizi takip etmeye devam edin.", + "postProcessDesc1": "Invoke AI son kullanıcıya yönelik bir çok özellik sunar. Görüntü kalitesi yükseltme, yüz restorasyonu WebUI üzerinden kullanılabilir. Metinden resime ve resimden metne araçlarına gelişmiş seçenekler menüsünden ulaşabilirsiniz. İsterseniz mevcut görüntü ekranının üzerindeki veya görüntüleyicideki görüntüyü doğrudan düzenleyebilirsiniz." + } +}