diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json
index d038208c580..580b2179f94 100644
--- a/invokeai/frontend/web/public/locales/en.json
+++ b/invokeai/frontend/web/public/locales/en.json
@@ -224,6 +224,7 @@
"discordLabel": "Discord",
"dontAskMeAgain": "Don't ask me again",
"dontShowMeThese": "Don't show me these",
+ "editName": "Edit name",
"editor": "Editor",
"error": "Error",
"error_withCount_one": "{{count}} error",
@@ -231,50 +232,67 @@
"model_withCount_one": "{{count}} model",
"model_withCount_other": "{{count}} models",
"file": "File",
+ "fitView": "Fit View",
"folder": "Folder",
"format": "format",
"githubLabel": "Github",
"goTo": "Go to",
"hotkeysLabel": "Hotkeys",
- "loadingImage": "Loading Image",
- "loadingModel": "Loading Model",
+ "hex": "Hex",
"imageFailedToLoad": "Unable to Load Image",
"img2img": "Image To Image",
"inpaint": "inpaint",
"input": "Input",
"installed": "Installed",
+ "json": "JSON",
"languagePickerLabel": "Language",
"linear": "Linear",
"load": "Load",
"loading": "Loading",
+ "loadingImage": "Loading Image",
+ "loadingModel": "Loading Model",
"localSystem": "Local System",
+ "minimize": "Minimize",
+ "next": "Next",
+ "noMatchingItems": "No matching items",
+ "notifications": "Notifications",
"learnMore": "Learn More",
"modelManager": "Model Manager",
"noMatches": "No matches",
"noOptions": "No options",
"nodes": "Workflows",
"notInstalled": "Not $t(common.installed)",
+ "openSlider": "Open slider",
"openInNewTab": "Open in New Tab",
"openInViewer": "Open in Viewer",
"orderBy": "Order By",
"outpaint": "outpaint",
"outputs": "Outputs",
"postprocessing": "Post Processing",
+ "previous": "Previous",
"random": "Random",
+ "removeFromCollection": "Remove from Collection",
"reportBugLabel": "Report Bug",
+ "resetView": "Reset View",
"safetensors": "Safetensors",
"save": "Save",
"saveAs": "Save As",
"saveChanges": "Save Changes",
+ "saveToAssets": "Save to Assets",
+ "settings": "Settings",
"settingsLabel": "Settings",
"simple": "Simple",
"somethingWentWrong": "Something went wrong",
"statusDisconnected": "Disconnected",
"template": "Template",
+ "toggleRgbHex": "Toggle RGB/HEX",
"toResolve": "To resolve",
"txt2img": "Text To Image",
"unknown": "Unknown",
+ "unpin": "Unpin",
"upload": "Upload",
+ "zoomIn": "Zoom In",
+ "zoomOut": "Zoom Out",
"updated": "Updated",
"created": "Created",
"prevPage": "Previous Page",
@@ -344,13 +362,19 @@
"discard": "Discard",
"noPromptHistory": "No prompt history recorded.",
"noMatchingPrompts": "No matching prompts in history.",
- "toSwitchBetweenPrompts": "to switch between prompts."
+ "toSwitchBetweenPrompts": "to switch between prompts.",
+ "promptHistory": "Prompt History",
+ "clearHistory": "Clear History",
+ "usePrompt": "Use prompt",
+ "searchPrompts": "Search..."
},
"queue": {
"queue": "Queue",
"queueFront": "Add to Front of Queue",
"queueBack": "Add to Queue",
+ "queueActionsMenu": "Queue Actions Menu",
"queueEmpty": "Queue Empty",
+ "queueItem": "Queue Item",
"enqueueing": "Queueing Batch",
"resume": "Resume",
"resumeTooltip": "Resume Processor",
@@ -493,7 +517,10 @@
"imagesSettings": "Gallery Images Settings",
"jump": "Jump",
"loading": "Loading",
+ "loadingGallery": "Loading gallery...",
+ "loadingMetadata": "Loading metadata...",
"newestFirst": "Newest First",
+ "noImagesFound": "No images found",
"oldestFirst": "Oldest First",
"sortDirection": "Sort Direction",
"showStarredImagesFirst": "Show Starred Images First",
@@ -505,6 +532,8 @@
"unableToLoad": "Unable to load Gallery",
"deleteSelection": "Delete Selection",
"downloadSelection": "Download Selection",
+ "bulkDownloadReady": "Download ready",
+ "clickToDownload": "Click here to download",
"bulkDownloadRequested": "Preparing Download",
"bulkDownloadRequestedDesc": "Your download request is being prepared. This may take a few moments.",
"bulkDownloadRequestFailed": "Problem Preparing Download",
@@ -936,7 +965,8 @@
}
},
"lora": {
- "weight": "Weight"
+ "weight": "Weight",
+ "removeLoRA": "Remove LoRA"
},
"metadata": {
"allPrompts": "All Prompts",
@@ -983,6 +1013,14 @@
"modelManager": {
"active": "active",
"actions": "Bulk Actions",
+ "deleteModelsConfirm": "Are you sure you want to delete {{count}} model(s)? This action cannot be undone.",
+ "deleteWarning": "Models in your Invoke models directory will be permanently deleted from disk.",
+ "modelsDeleted": "Successfully deleted {{count}} model(s)",
+ "modelsDeleteFailed": "Failed to delete models",
+ "someModelsFailedToDelete": "{{count}} model(s) could not be deleted",
+ "modelsDeletedPartial": "Partially completed",
+ "someModelsDeleted": "{{deleted}} deleted, {{failed}} failed",
+ "modelsDeleteError": "Error deleting models",
"pause": "Pause",
"pauseAll": "Pause All",
"pauseAllTooltip": "Pause all active downloads",
@@ -1331,6 +1369,7 @@
"noWorkflows": "No Workflows",
"noMatchingWorkflows": "No Matching Workflows",
"noWorkflow": "No Workflow",
+ "noWorkflowToSave": "No workflow to save",
"unableToUpdateNode": "Node update failed: node {{node}} of type {{type}} (may require deleting and recreating)",
"mismatchedVersion": "Invalid node: node {{node}} of type {{type}} has mismatched version (try updating?)",
"missingTemplate": "Invalid node: node {{node}} of type {{type}} missing template (not installed?)",
@@ -1354,6 +1393,7 @@
"nodeOpacity": "Node Opacity",
"nodeVersion": "Node Version",
"noOutputRecorded": "No outputs recorded",
+ "nodeData": "Node Data",
"notes": "Notes",
"description": "Description",
"notesDescription": "Add notes about your workflow",
@@ -1603,6 +1643,7 @@
"perPromptDesc": "Use a different seed for each image"
},
"loading": "Generating Dynamic Prompts...",
+ "problemGeneratingPrompts": "Problem generating prompts",
"promptsToGenerate": "Prompts to Generate"
},
"sdxl": {
@@ -2479,6 +2520,8 @@
"disableAutoNegative": "Disable Auto Negative",
"deletePrompt": "Delete Prompt",
"deleteReferenceImage": "Delete Reference Image",
+ "disableReferenceImage": "Disable Reference Image",
+ "enableReferenceImage": "Enable Reference Image",
"showHUD": "Show HUD",
"rectangle": "Rectangle",
"maskFill": "Mask Fill",
@@ -2499,6 +2542,7 @@
"controlLayer": "Control Layer",
"inpaintMask": "Inpaint Mask",
"invertMask": "Invert Mask",
+ "invertRegion": "Invert Region",
"regionalGuidance": "Regional Guidance",
"referenceImageRegional": "Reference Image (Regional)",
"referenceImageGlobal": "Reference Image (Global)",
@@ -2506,7 +2550,10 @@
"asRasterLayerResize": "As $t(controlLayers.rasterLayer) (Resize)",
"asControlLayer": "As $t(controlLayers.controlLayer)",
"asControlLayerResize": "As $t(controlLayers.controlLayer) (Resize)",
+ "invalidReferenceImage": "Invalid Reference Image:",
"referenceImage": "Reference Image",
+ "removeImageFromCollection": "Remove Image from Collection",
+ "selectRefImage": "Select Ref Image",
"maxRefImages": "Max Ref Images",
"useAsReferenceImage": "Use as Reference Image",
"regionalReferenceImage": "Regional Reference Image",
@@ -2527,7 +2574,11 @@
"alignLeft": "Align Left",
"alignCenter": "Align Center",
"alignRight": "Align Right",
- "px": "px"
+ "px": "px",
+ "lineHeight": "Spacing",
+ "lineHeightDense": "Dense",
+ "lineHeightNormal": "Normal",
+ "lineHeightSpacious": "Spacious"
},
"newCanvasFromImage": "New Canvas from Image",
"newImg2ImgCanvasFromImage": "New Img2Img from Image",
@@ -2674,7 +2725,8 @@
"crosshatch": "Crosshatch",
"vertical": "Vertical",
"horizontal": "Horizontal",
- "diagonal": "Diagonal"
+ "diagonal": "Diagonal",
+ "switchColors": "Switch FG/BG (X)"
},
"gradient": {
"linear": "Linear",
@@ -2938,8 +2990,11 @@
},
"autoSwitch": {
"off": "Off",
+ "doNotAutoSwitch": "Do not auto-switch",
"switchOnStart": "On Start",
- "switchOnFinish": "On Finish"
+ "switchOnStartDesc": "Switch on start",
+ "switchOnFinish": "On Finish",
+ "switchOnFinishDesc": "Switch on finish"
}
},
"upscaling": {
@@ -3158,9 +3213,21 @@
"watchRecentReleaseVideos": "Watch Recent Release Videos",
"watchUiUpdatesOverview": "Watch UI Updates Overview"
},
+ "cropper": {
+ "cropImage": "Crop Image",
+ "aspectRatio": "Aspect Ratio",
+ "free": "Free",
+ "mouseWheelZoom": "Mouse wheel: Zoom",
+ "spaceDragPan": "Space + Drag: Pan",
+ "dragCropBoxToAdjust": "Drag crop box or handles to adjust"
+ },
"supportVideos": {
"supportVideos": "Support Videos",
"gettingStarted": "Getting Started",
+ "gettingStartedPlaylist": "Getting Started playlist",
+ "studioSessionsPlaylist": "Studio Sessions playlist",
+ "discord": "Discord",
+ "github": "GitHub",
"watch": "Watch",
"studioSessionsDesc": "Join our to participate in the live sessions and ask questions. Sessions are uploaded to the playlist the following week.",
"videos": {
diff --git a/invokeai/frontend/web/src/common/components/ColorPicker/RgbaColorPicker.tsx b/invokeai/frontend/web/src/common/components/ColorPicker/RgbaColorPicker.tsx
index 6bcf546fd34..38fcb2696ef 100644
--- a/invokeai/frontend/web/src/common/components/ColorPicker/RgbaColorPicker.tsx
+++ b/invokeai/frontend/web/src/common/components/ColorPicker/RgbaColorPicker.tsx
@@ -85,7 +85,7 @@ const RgbaColorPicker = (props: Props) => {
h={10}
whiteSpace="nowrap"
onClick={onToggleMode}
- aria-label="Toggle RGB/HEX"
+ aria-label={t('common.toggleRgbHex')}
>
RGB
@@ -144,12 +144,12 @@ const RgbaColorPicker = (props: Props) => {
h={10}
whiteSpace="nowrap"
onClick={onToggleMode}
- aria-label="Toggle RGB/HEX"
+ aria-label={t('common.toggleRgbHex')}
>
HEX
- {t('common.hex', { defaultValue: 'Hex' })}
+ {t('common.hex')}
diff --git a/invokeai/frontend/web/src/common/hooks/useImageUploadButton.tsx b/invokeai/frontend/web/src/common/hooks/useImageUploadButton.tsx
index 445f58c9a66..fc173de979f 100644
--- a/invokeai/frontend/web/src/common/hooks/useImageUploadButton.tsx
+++ b/invokeai/frontend/web/src/common/hooks/useImageUploadButton.tsx
@@ -187,11 +187,12 @@ export const UploadImageIconButton = memo(
onUpload?: (imageDTO: ImageDTO) => void;
isError?: boolean;
} & SetOptional) => {
+ const { t } = useTranslation();
const uploadApi = useImageUploadButton({ isDisabled, allowMultiple: false, onUpload });
return (
<>
{
+ const { t } = useTranslation();
const { children, isDisabled = false, onUpload, isError = false, ...rest } = props;
const uploadApi = useImageUploadButton({ isDisabled, allowMultiple: false, onUpload });
return (
<>
{tab === 'canvas' && (
diff --git a/invokeai/frontend/web/src/features/controlLayers/components/RefImage/RefImagePreview.tsx b/invokeai/frontend/web/src/features/controlLayers/components/RefImage/RefImagePreview.tsx
index 84c1b2fc37b..b910f3f1399 100644
--- a/invokeai/frontend/web/src/features/controlLayers/components/RefImage/RefImagePreview.tsx
+++ b/invokeai/frontend/web/src/features/controlLayers/components/RefImage/RefImagePreview.tsx
@@ -13,6 +13,7 @@ import {
import { isIPAdapterConfig } from 'features/controlLayers/store/types';
import { getGlobalReferenceImageWarnings } from 'features/controlLayers/store/validators';
import { memo, useCallback, useEffect, useMemo, useState } from 'react';
+import { useTranslation } from 'react-i18next';
import { PiExclamationMarkBold, PiEyeSlashBold, PiImageBold } from 'react-icons/pi';
import { useImageDTOFromCroppableImage } from 'services/api/endpoints/images';
@@ -64,6 +65,7 @@ const getImageSxWithWeight = (weight: number): SystemStyleObject => {
};
export const RefImagePreview = memo(() => {
+ const { t } = useTranslation();
const dispatch = useAppDispatch();
const id = useRefImageIdContext();
const entity = useRefImageEntity(id);
@@ -105,7 +107,7 @@ export const RefImagePreview = memo(() => {
if (!entity.config.image) {
return (
- Invalid Reference Image:
+ {t('controlLayers.invalidReferenceImage')}
{warnings.map((tKey) => (
{upperFirst(t(tKey))}
diff --git a/invokeai/frontend/web/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx b/invokeai/frontend/web/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx
index f9fc483eea5..eca468fe3fd 100644
--- a/invokeai/frontend/web/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx
+++ b/invokeai/frontend/web/src/features/controlLayers/components/StagingArea/StagingAreaAutoSwitchButtons.tsx
@@ -7,9 +7,11 @@ import {
settingsStagingAreaAutoSwitchChanged,
} from 'features/controlLayers/store/canvasSettingsSlice';
import { memo, useCallback } from 'react';
+import { useTranslation } from 'react-i18next';
import { PiCaretLineRightBold, PiCaretRightBold, PiMoonBold } from 'react-icons/pi';
export const StagingAreaAutoSwitchButtons = memo(() => {
+ const { t } = useTranslation();
const canvasManager = useCanvasManager();
const shouldShowStagedImage = useStore(canvasManager.stagingArea.$shouldShowStagedImage);
@@ -29,24 +31,24 @@ export const StagingAreaAutoSwitchButtons = memo(() => {
return (
<>
}
colorScheme={autoSwitch === 'off' ? 'invokeBlue' : 'base'}
onClick={onClickOff}
isDisabled={!shouldShowStagedImage}
/>
}
colorScheme={autoSwitch === 'switch_on_start' ? 'invokeBlue' : 'base'}
onClick={onClickSwitchOnStart}
isDisabled={!shouldShowStagedImage}
/>
}
colorScheme={autoSwitch === 'switch_on_finish' ? 'invokeBlue' : 'base'}
onClick={onClickSwitchOnFinished}
diff --git a/invokeai/frontend/web/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenu.tsx b/invokeai/frontend/web/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenu.tsx
index ce32c823aa5..42b92d3db94 100644
--- a/invokeai/frontend/web/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenu.tsx
+++ b/invokeai/frontend/web/src/features/controlLayers/components/StagingArea/StagingAreaToolbarMenu.tsx
@@ -3,16 +3,18 @@ import { useStore } from '@nanostores/react';
import { StagingAreaToolbarNewLayerFromImageMenuItems } from 'features/controlLayers/components/StagingArea/StagingAreaToolbarMenuNewLayerFromImage';
import { useCanvasManager } from 'features/controlLayers/contexts/CanvasManagerProviderGate';
import { memo } from 'react';
+import { useTranslation } from 'react-i18next';
import { PiDotsThreeVerticalBold } from 'react-icons/pi';
export const StagingAreaToolbarMenu = memo(() => {
+ const { t } = useTranslation();
const canvasManager = useCanvasManager();
const shouldShowStagedImage = useStore(canvasManager.stagingArea.$shouldShowStagedImage);
return (