2026-03-22 04:42:19 +08:00
export const en = {
common : {
upload : "Upload from computer" ,
process : "Process" ,
download : "Download" ,
cancel : "Cancel" ,
save : "Save" ,
delete : "Delete" ,
settings : "Settings" ,
search : "Search tools..." ,
dropFiles : "Drop files here or click the upload button" ,
loading : "Loading..." ,
error : "An error occurred" ,
confirm : "Confirm" ,
close : "Close" ,
back : "Back" ,
next : "Next" ,
clear : "Clear" ,
copy : "Copy" ,
copied : "Copied!" ,
noResults : "No results found" ,
2026-05-15 17:02:49 +08:00
showLess : "Show less" ,
showMore : "Show {count} more" ,
experimental : "Experimental" ,
enabled : "Enabled" ,
disabled : "Disabled" ,
rename : "Rename" ,
edit : "Edit" ,
actions : "Actions" ,
create : "Create" ,
retry : "Retry" ,
or : "or" ,
goHome : "Go Home" ,
somethingWentWrong : "Something went wrong" ,
unexpectedError : "An unexpected error occurred." ,
privacyPolicy : "Privacy Policy" ,
},
categories : {
essentials : "Essentials" ,
optimization : "Optimization" ,
adjustments : "Adjustments" ,
watermark : "Watermark & Overlay" ,
utilities : "Utilities" ,
layout : "Layout & Composition" ,
format : "Format & Conversion" ,
ai : "AI Tools" ,
2026-03-22 04:42:19 +08:00
},
tools : {
2026-03-25 09:27:12 +08:00
resize : {
name : "Resize" ,
description : "Resize by pixels, percentage, or social media presets" ,
},
2026-03-22 04:42:19 +08:00
crop : { name : "Crop" , description : "Freeform crop, aspect ratio presets, shape crop" },
rotate : { name : "Rotate & Flip" , description : "Rotate, flip, and straighten images" },
convert : { name : "Convert" , description : "Convert between image formats" },
compress : { name : "Compress" , description : "Reduce file size by quality or target size" },
2026-04-14 16:16:04 +08:00
"optimize-for-web" : {
name : "Optimize for Web" ,
description :
"Optimize images for web with format conversion, quality control, and live preview" ,
},
2026-05-15 17:02:49 +08:00
"strip-metadata" : {
name : "Remove Metadata" ,
description : "Remove EXIF, GPS, and camera info" ,
},
2026-04-12 08:50:19 +08:00
"edit-metadata" : {
name : "Edit Metadata" ,
description : "Edit EXIF, IPTC, XMP, GPS, keywords, and dates" ,
},
2026-03-22 04:42:19 +08:00
"bulk-rename" : { name : "Bulk Rename" , description : "Rename multiple files with patterns" },
2026-04-27 21:57:11 +08:00
"image-to-pdf" : {
name : "Image to PDF" ,
description : "Combine images into a PDF document" ,
},
2026-04-05 22:56:15 +08:00
"pdf-to-image" : { name : "PDF to Image" , description : "Convert PDF pages to images" },
2026-05-15 17:02:49 +08:00
favicon : {
name : "Favicon Generator" ,
description : "Generate all favicon and app icon sizes" ,
},
2026-04-12 17:53:16 +08:00
"adjust-colors" : {
name : "Adjust Colors" ,
description :
"Brightness, contrast, exposure, saturation, temperature, sharpness, and effects" ,
2026-03-25 09:27:12 +08:00
},
2026-04-13 19:12:09 +08:00
sharpening : {
name : "Sharpening" ,
description : "Adaptive, unsharp mask, and high-pass sharpening with presets" ,
},
2026-03-25 09:27:12 +08:00
"replace-color" : {
name : "Replace & Invert Color" ,
description : "Replace specific colors or invert" ,
},
2026-05-08 15:15:39 +08:00
"color-blindness" : {
name : "Color Blindness Simulation" ,
description : "Simulate how images appear with different types of color vision deficiency" ,
},
2026-03-25 09:27:12 +08:00
"remove-background" : {
name : "Remove Background" ,
description : "AI-powered background removal" ,
},
2026-03-22 04:42:19 +08:00
upscale : { name : "Image Upscaling" , description : "AI super-resolution enhancement" },
2026-04-13 00:47:53 +08:00
"erase-object" : { name : "Object Eraser" , description : "Remove unwanted objects with AI" },
2026-04-12 18:39:12 +08:00
ocr : {
name : "OCR / Text Extraction" ,
description : "Extract text from images with AI-powered accuracy" ,
},
2026-03-25 09:27:12 +08:00
"blur-faces" : {
name : "Face / PII Blur" ,
description : "Auto-detect and blur faces and sensitive info" ,
},
2026-04-13 21:56:59 +08:00
"enhance-faces" : {
name : "Face Enhancement" ,
description : "Restore and enhance faces with AI" ,
},
2026-04-13 00:47:53 +08:00
"smart-crop" : {
name : "Smart Crop" ,
description : "Smart subject, face, or trim-based cropping" ,
},
2026-04-13 17:48:53 +08:00
"image-enhancement" : {
name : "Image Enhancement" ,
description :
"One-click auto-improve with smart exposure, contrast, color, and sharpness correction" ,
},
2026-04-13 19:50:23 +08:00
"noise-removal" : {
name : "Noise Removal" ,
description : "AI-powered noise and grain removal" ,
},
2026-04-13 20:22:30 +08:00
"red-eye-removal" : {
name : "Red Eye Removal" ,
description : "AI-powered red eye detection and correction for flash photos" ,
},
2026-04-13 21:57:51 +08:00
"restore-photo" : {
name : "Photo Restoration" ,
description : "Fix scratches, tears, and damage on old photos with AI" ,
},
2026-04-07 23:29:21 +08:00
"content-aware-resize" : {
name : "Content-Aware Resize" ,
description : "Intelligently resize images while preserving important content" ,
},
2026-05-13 16:15:13 +08:00
"ai-canvas-expand" : {
name : "AI Canvas Expand" ,
description : "Expand canvas with AI-powered fill" ,
2026-05-11 21:08:30 +08:00
},
2026-04-13 19:40:55 +08:00
colorize : {
name : "AI Colorization" ,
description : "Convert black & white photos to full color using AI deep learning models" ,
},
2026-04-14 09:59:48 +08:00
"passport-photo" : {
name : "Passport Photo" ,
description :
"Create government-compliant passport, visa, and ID photos with auto face detection" ,
},
2026-05-05 22:58:30 +08:00
"transparency-fixer" : {
2026-05-06 18:53:37 +08:00
name : "PNG Transparency Fixer" ,
2026-05-05 22:58:30 +08:00
description : "Fix fake transparent PNGs in one click" ,
},
2026-03-22 04:42:19 +08:00
"watermark-text" : { name : "Text Watermark" , description : "Add text watermark overlay" },
"watermark-image" : { name : "Image Watermark" , description : "Overlay a logo as watermark" },
"text-overlay" : { name : "Text Overlay" , description : "Add styled text to images" },
compose : { name : "Image Composition" , description : "Layer images with position and opacity" },
2026-05-08 15:38:31 +08:00
"meme-generator" : {
name : "Meme Generator" ,
description :
"Create memes with popular templates or your own images. Classic Impact-style text with customizable fonts, colors, and positioning." ,
},
2026-03-22 04:42:19 +08:00
info : { name : "Image Info" , description : "View all metadata and image properties" },
compare : { name : "Image Compare" , description : "Side-by-side comparison of two images" },
2026-03-25 09:27:12 +08:00
"find-duplicates" : {
name : "Find Duplicates" ,
description : "Detect duplicate and near-duplicate images" ,
},
2026-05-15 17:02:49 +08:00
"color-palette" : {
name : "Color Palette" ,
description : "Extract dominant colors from image" ,
},
2026-03-25 09:27:12 +08:00
"qr-generate" : {
name : "QR Code Generator" ,
2026-04-13 09:59:12 +08:00
description : "Generate styled QR codes with custom colors, patterns, and logos" ,
2026-03-25 09:27:12 +08:00
},
"barcode-read" : {
name : "Barcode Reader" ,
2026-04-13 11:36:05 +08:00
description : "Scan images for QR codes, barcodes, and 2D codes" ,
2026-03-25 09:27:12 +08:00
},
2026-04-13 11:40:07 +08:00
collage : {
name : "Collage / Grid" ,
description : "Combine images into beautiful grid collages with 25+ templates" ,
2026-03-25 09:27:12 +08:00
},
2026-04-13 16:23:07 +08:00
stitch : {
name : "Stitch / Combine" ,
description : "Join images side by side, stacked, or in a grid" ,
},
split : {
name : "Image Splitting" ,
description : "Split images into grid tiles or by pixel size with live preview" ,
},
border : {
name : "Border & Frame" ,
description : "Add borders, padding, rounded corners, and shadows with one-click presets" ,
},
2026-05-08 15:58:10 +08:00
beautify : {
name : "Beautify Screenshot" ,
description :
"Add gradient backgrounds, device frames, shadows, and social media sizing to screenshots" ,
},
2026-03-25 09:27:12 +08:00
"svg-to-raster" : {
name : "SVG to Raster" ,
2026-04-13 12:52:33 +08:00
description :
"Convert SVG to PNG, JPEG, WebP, AVIF, TIFF, GIF, or HEIF at custom scale and DPI" ,
2026-03-25 09:27:12 +08:00
},
2026-05-15 17:02:49 +08:00
vectorize : {
name : "Image to SVG" ,
description : "Convert images to scalable vector graphics" ,
},
2026-04-13 16:23:07 +08:00
"gif-tools" : {
name : "GIF Tools" ,
description :
"Resize, optimize, change speed, reverse, extract frames, and rotate animated GIFs" ,
},
2026-04-14 10:17:19 +08:00
"image-to-base64" : {
name : "Image to Base64" ,
description : "Convert images to base64 strings for embedding in HTML, CSS, and more" ,
},
2026-03-22 04:42:19 +08:00
pipeline : { name : "Pipeline Builder" , description : "Chain multiple tools into a workflow" },
},
2026-05-15 17:02:49 +08:00
toolSettings : {
compress : {
compressionMode : "Compression Mode" ,
targetSize : "Target Size" ,
quality : "Quality" ,
smallestFile : "Smallest file" ,
bestQuality : "Best quality" ,
submit : "Compress" ,
submitBatch : "Compress ({count} files)" ,
progressLabel : "Compressing" ,
original : "Original: {size} KB" ,
processed : "Processed: {size} KB" ,
saved : "Saved: {percent}%" ,
},
resize : {
customSize : "Custom Size" ,
scale : "Scale" ,
presets : "Presets" ,
contentAware : "Content-Aware" ,
widthPx : "Width (px)" ,
heightPx : "Height (px)" ,
fitMode : "Fit Mode" ,
cropToFit : "Crop to fit" ,
fitInside : "Fit inside" ,
stretch : "Stretch" ,
limitToOriginalSize : "Limit to original size" ,
limitToOriginalSizeHint :
"If your image is already smaller than the target, keep it as-is instead of scaling it up" ,
scalePercent : "Scale (%)" ,
resizeToSquare : "Resize to square" ,
protectFaces : "Protect faces" ,
smoothing : "Smoothing" ,
edgeSensitivity : "Edge sensitivity" ,
submit : "Resize" ,
submitBatch : "Resize ({count} files)" ,
progressLabel : "Resizing" ,
},
crop : {
aspectRatio : "Aspect Ratio" ,
custom : "Custom" ,
positionAndSize : "Position & Size" ,
ruleOfThirds : "Rule of Thirds" ,
leftOffsetPx : "Left offset (px)" ,
topOffsetPx : "Top offset (px)" ,
submit : "Crop" ,
submitBatch : "Crop ({count} files)" ,
progressLabel : "Cropping" ,
},
rotate : {
rotate : "Rotate" ,
angle : "Angle" ,
straighten : "Straighten" ,
flip : "Flip" ,
horizontal : "Horizontal" ,
vertical : "Vertical" ,
resetAllChanges : "Reset all changes" ,
submit : "Apply" ,
submitBatch : "Apply ({count} files)" ,
progressLabel : "Applying" ,
},
convert : {
targetFormat : "Target Format" ,
sourceFormat : "Source Format" ,
quality : "Quality" ,
submit : "Convert" ,
submitBatch : "Convert ({count} files)" ,
progressLabel : "Converting" ,
},
"optimize-for-web" : {
outputFormat : "Output Format" ,
quality : "Quality" ,
smallestFile : "Smallest file" ,
bestQuality : "Best quality" ,
maxDimensions : "Max Dimensions" ,
maxWidth : "Max Width" ,
maxHeight : "Max Height" ,
stripMetadata : "Strip Metadata" ,
sizeComparison : "Size Comparison" ,
optimized : "Optimized:" ,
smaller : "{percent}% smaller" ,
larger : "{percent}% larger" ,
submit : "Process & Download" ,
submitBatch : "Process & Download ({count} files)" ,
progressLabel : "Optimizing" ,
},
"strip-metadata" : {
currentMetadata : "Current Metadata" ,
readingMetadata : "Reading metadata..." ,
noMetadataFound : "No metadata found in this image." ,
removeAllMetadata : "Remove All Metadata" ,
selectSpecific : "Or select specific metadata:" ,
stripExif : "Strip EXIF (camera info, date, exposure)" ,
stripGps : "Strip GPS (location data)" ,
stripIcc : "Strip ICC (color profile)" ,
stripXmp : "Strip XMP (extensible metadata)" ,
locationFound : "location found" ,
locationWarning :
"This image contains your precise location. Consider removing GPS data before sharing." ,
metadataSections : "{count} metadata section found" ,
metadataSectionsPlural : "{count} metadata sections found" ,
metadataRemoved : "Metadata removed: {size} KB" ,
submit : "Remove Metadata" ,
progressLabel : "Removing metadata" ,
},
"edit-metadata" : {
readingMetadata : "Reading metadata..." ,
couldNotReadMetadata : "Could not read metadata - fields will start empty." ,
basicInfo : "Basic Info" ,
description : "Description" ,
artist : "Artist" ,
copyright : "Copyright" ,
software : "Software" ,
iptc : "IPTC" ,
title : "Title" ,
headline : "Headline" ,
city : "City" ,
stateProvince : "State/Province" ,
country : "Country" ,
dateAndTime : "Date & Time" ,
editDates : "Edit Dates" ,
shiftAllDates : "Shift All Dates" ,
dateModified : "Date Modified" ,
dateTaken : "Date Taken" ,
shiftHint : "Shift all date fields by an offset (useful for timezone corrections)" ,
direction : "Direction" ,
forward : "+ Forward" ,
backward : "- Backward" ,
hoursMinutes : "Hours:Minutes" ,
locationGps : "Location (GPS)" ,
locationDataFound : "Location data found" ,
noGpsData : "No GPS data. Add coordinates below." ,
latitude : "Latitude" ,
longitude : "Longitude" ,
altitudeMeters : "Altitude (meters)" ,
removeAllGpsData : "Remove all GPS data" ,
keywords : "Keywords" ,
addKeywordPlaceholder : "Add keyword and press Enter" ,
addToExisting : "Add to existing" ,
replaceAll : "Replace all" ,
allMetadata : "All Metadata" ,
templates : "Templates" ,
templateNamePlaceholder : "Template name" ,
uploadPrompt : "Upload an image to edit its metadata." ,
changes : "{count} changes:" ,
modified : "{count} modified" ,
removed : "{count} removed" ,
gpsCleared : "GPS cleared" ,
gpsAdded : "GPS added" ,
datesShifted : "dates shifted" ,
submit : "Apply Metadata" ,
progressLabel : "Writing metadata" ,
},
"bulk-rename" : {
pattern : "Pattern" ,
patternHint : "Variables: {{index}}, {{padded}}, {{original}}" ,
startIndex : "Start Index" ,
preview : "Preview" ,
andMore : "... and {count} more" ,
renaming : "Renaming..." ,
submit : "Rename {count} Files" ,
zipDownloaded : "ZIP downloaded successfully" ,
},
"image-to-pdf" : {
imageCount : "{count} image will be converted to {mode}" ,
imageCountPlural : "{count} images will be converted to {mode}" ,
singlePdfMode : "a single PDF, one image per page" ,
separatePdfMode : "separate PDFs, one per image" ,
combineAllImages : "Combine all images into one PDF" ,
pageSize : "Page Size" ,
orientation : "Orientation" ,
portrait : "Portrait" ,
landscape : "Landscape" ,
margin : "Margin" ,
targetSizeLabel : "Target file size (optional)" ,
targetSizePlaceholder : "e.g. 2" ,
targetSizeHint : "Leave empty for maximum quality" ,
targetSizeMet : "Target met" ,
targetSizeNotMet : "Could not reach target. File compressed to minimum quality." ,
targetSizeTooSmall : "Target must be at least 50KB" ,
jpegQualityLabel : "JPEG quality used" ,
noImage : "No image" ,
submitCollate : "Create PDF ({count} pages)" ,
submitSeparate : "Create {count} PDFs" ,
downloadPdf : "Download PDF" ,
downloadZip : "Download ZIP" ,
progressLabel : "Creating PDF" ,
uploadingImages : "Uploading images..." ,
processingPages : "Processing {count} pages..." ,
},
"pdf-to-image" : {
dropPdf : "Drop a PDF here or click to select" ,
readingPdf : "Reading PDF..." ,
pageCount : "{count} page" ,
pageCountPlural : "{count} pages" ,
outputFormat : "Output Format" ,
quality : "Quality" ,
resolutionDpi : "Resolution (DPI)" ,
dpiScreen : "Screen" ,
dpiStandard : "Standard" ,
dpiPrint : "Print" ,
dpiHighQuality : "High Quality" ,
colorMode : "Color Mode" ,
colorModeColor : "Color" ,
colorModeGrayscale : "Grayscale" ,
colorModeBw : "B&W" ,
pages : "Pages" ,
allPages : "All pages" ,
pagesHint : "e.g. 1-3, 5, 8-10 (document has {count} pages)" ,
converting : "Converting..." ,
submit : "Convert {count} page" ,
submitPlural : "Convert {count} pages" ,
downloadAllZip : "Download All (ZIP)" ,
},
favicon : {
uploadHint :
"Upload square images (recommended 512x512 or larger) to generate all favicon and app icon sizes." ,
multipleHint : "Each of the {count} images gets its own folder in the ZIP." ,
generatedSizes : "Generated Sizes (per image)" ,
plusManifest : "+ manifest.json + HTML snippet" ,
submit : "Generate Favicons ({count} image)" ,
submitPlural : "Generate Favicons ({count} images)" ,
downloadZip : "Download Favicons ZIP" ,
progressLabel : "Generating Favicons" ,
},
"adjust-colors" : {
light : "Light" ,
brightness : "Brightness" ,
contrast : "Contrast" ,
exposure : "Exposure" ,
color : "Color" ,
saturation : "Saturation" ,
temperature : "Temperature" ,
temperatureHint : "cool / warm" ,
tint : "Tint" ,
tintHint : "green / magenta" ,
hue : "Hue" ,
detail : "Detail" ,
sharpness : "Sharpness" ,
effects : "Effects" ,
none : "none" ,
grayscale : "grayscale" ,
sepia : "sepia" ,
invert : "invert" ,
colorChannels : "Color Channels" ,
channelModified : "modified" ,
red : "Red" ,
green : "Green" ,
blue : "Blue" ,
resetAll : "Reset All" ,
submit : "Apply" ,
submitBatch : "Apply ({count} files)" ,
progressLabel : "Adjusting colors" ,
},
sharpening : {
method : "Method" ,
adaptive : "Adaptive" ,
unsharpMask : "Unsharp Mask" ,
highPass : "High-Pass" ,
presets : "Presets" ,
textureAmount : "Texture Amount" ,
amount : "Amount" ,
strength : "Strength" ,
noiseReduction : "Noise Reduction" ,
off : "off" ,
lightDenoise : "light" ,
mediumDenoise : "medium" ,
strongDenoise : "strong" ,
advancedControls : "Advanced Controls" ,
radius : "Radius" ,
flatProtection : "Flat Protection" ,
detailThreshold : "Detail Threshold" ,
haloLimitLight : "Halo Limit (Light)" ,
haloLimitDark : "Halo Limit (Dark)" ,
threshold : "Threshold" ,
kernelSize : "Kernel Size" ,
submit : "Sharpen" ,
submitBatch : "Sharpen ({count} files)" ,
progressLabel : "Sharpening" ,
},
"replace-color" : {
sourceColor : "Source Color (to replace)" ,
targetColor : "Target Color (replacement)" ,
makeTransparent : "Make transparent instead" ,
tolerance : "Tolerance" ,
exactMatch : "Exact match" ,
wideRange : "Wide range" ,
submit : "Replace Color" ,
submitBatch : "Replace Color ({count} files)" ,
progressLabel : "Replacing color" ,
},
"color-blindness" : {
simulationType : "Simulation Type" ,
redGreen : "Red-Green" ,
blueYellow : "Blue-Yellow" ,
monochromatic : "Monochromatic" ,
submit : "Simulate" ,
submitBatch : "Simulate ({count} files)" ,
progressLabel : "Simulating color blindness" ,
},
"remove-background" : {
subject : "Subject" ,
people : "People" ,
products : "Products" ,
general : "General" ,
passportIdPhoto : "Passport / ID photo" ,
quality : "Quality" ,
fast : "Fast" ,
hd : "HD" ,
max : "Max" ,
ultra : "Ultra" ,
background : "Background" ,
transparent : "Transparent" ,
bgColor : "Color" ,
gradient : "Gradient" ,
image : "Image" ,
gradientDirection : "Direction" ,
chooseBackgroundImage : "Choose background image" ,
effectsSection : "Effects" ,
effectsActive : "active" ,
blurBackground : "Blur Background" ,
intensity : "Intensity" ,
addShadow : "Add Shadow" ,
opacity : "Opacity" ,
rendering : "Rendering..." ,
submit : "Remove Background" ,
submitBatch : "Remove Background ({count} files)" ,
progressLabel : "Removing background" ,
},
upscale : {
scaleFactor : "Scale Factor" ,
quality : "Quality" ,
enhanceFaces : "Enhance faces" ,
noiseReduction : "Noise Reduction" ,
noiseReductionHint :
"Smooths out grain and noise. Higher values remove more noise but may soften details." ,
outputFormat : "Output Format" ,
submit : "Upscale {scale}x" ,
submitBatch : "Upscale {scale}x ({count} files)" ,
progressLabel : "Upscaling image" ,
progressLabelBatch : "Upscaling {count} images" ,
},
"erase-object" : {
brushSize : "Brush Size" ,
fine : "Fine" ,
wide : "Wide" ,
undo : "Undo" ,
clear : "Clear" ,
outputFormat : "Output Format" ,
quality : "Quality" ,
paintHint : "Paint over the objects you want to remove. Use Ctrl+Z to undo." ,
submit : "Erase Object" ,
submitBatch : "Erase All ({count})" ,
progressLabel : "Erasing object" ,
},
ocr : {
quality : "Quality" ,
enhanceBeforeScanning : "Enhance before scanning" ,
enhanceHint :
"Automatically deskews, enhances contrast, removes noise, and upscales the image before scanning for better accuracy." ,
language : "Language" ,
autoDetect : "Auto-detect" ,
extractedText : "Extracted Text" ,
noTextDetected : "No text detected in this image" ,
characters : "{count} characters" ,
submit : "Extract Text" ,
submitBatch : "Extract Text ({count} files)" ,
progressLabel : "Extracting text" ,
},
"blur-faces" : {
blurRadius : "Blur Radius" ,
blurLight : "Light" ,
blurHeavy : "Heavy" ,
detectionSensitivity : "Detection Sensitivity" ,
moreFaces : "More faces" ,
fewerFaces : "Fewer faces" ,
submit : "Blur Faces" ,
progressLabel : "Blurring faces" ,
},
"enhance-faces" : {
quality : "Quality" ,
enhancementStrength : "Enhancement Strength" ,
onlyCenterFace : "Center face only" ,
detectionSensitivity : "Detection Sensitivity" ,
submit : "Enhance Faces" ,
submitBatch : "Enhance Faces ({count} files)" ,
progressLabel : "Enhancing faces" ,
},
"smart-crop" : {
subjectFocus : "Subject Focus" ,
faceFocus : "Face Focus" ,
autoTrim : "Auto Trim" ,
customSize : "Custom Size" ,
socialPresets : "Social Presets" ,
detectionStrategy : "Detection Strategy" ,
detectionStrategyHint :
"Attention finds the most visually salient region. Entropy finds the area with most detail and information." ,
attention : "Attention" ,
entropy : "Entropy" ,
padding : "Padding" ,
paddingHint : "Extra breathing room around the focus area" ,
outputQuality : "Output Quality" ,
outputQualityHint : "For JPEG and WebP outputs. PNG is always lossless." ,
subjectDescription :
"Detects the most interesting region using saliency analysis and crops to your target size." ,
framing : "Framing" ,
facePadding : "Face Padding" ,
facePaddingHint : "Extra space around detected faces" ,
fewerFalsePositives : "Fewer false positives" ,
faceDescription :
"Uses AI face detection to keep faces properly framed. Falls back to Subject Focus if no faces are detected." ,
trimTolerance : "Tolerance" ,
trimDescription :
"How different a border pixel can be from the edge color and still be trimmed. Higher = more aggressive." ,
padToSquare : "Pad to square" ,
targetSizePx : "Target size (px)" ,
padColor : "Pad color" ,
trimHint :
'Removes uniform-color borders around your subject. Enable "Pad to square" for e-commerce ready images.' ,
submitSubject : "Smart Crop" ,
submitFace : "Face Crop" ,
submitTrim : "Trim Borders" ,
},
imageEnhancement : {
enhancementMode : "Enhancement Mode" ,
auto : "Auto" ,
portrait : "Portrait" ,
landscape : "Landscape" ,
lowLight : "Low Light" ,
food : "Food" ,
document : "Document" ,
intensity : "Intensity" ,
deepEnhance : "Deep Enhance (AI)" ,
deepEnhanceDescription : "Removes noise and artifacts using AI" ,
deepEnhanceRequires : "Requires Upscale & Enhance bundle" ,
analyzingImage : "Analyzing image..." ,
detectedIssues : "Detected Issues" ,
imageLooksGood : "Image looks good. Fine-tune with the intensity slider." ,
issueUnderexposed : "Low Exposure" ,
issueOverexposed : "Overexposed" ,
issueLowContrast : "Flat Contrast" ,
issueColorCast : "Color Cast" ,
issueDesaturated : "Desaturated" ,
issueSoftFocus : "Soft Focus" ,
issueNoisy : "Noisy" ,
submit : "Enhance" ,
submitDeep : "Deep Enhance" ,
submitBatch : "Enhance ({count} files)" ,
submitDeepBatch : "Deep Enhance ({count} files)" ,
progressLabel : "Enhancing image" ,
progressLabelBatch : "Enhancing {count} images" ,
},
"noise-removal" : {
denoisingTier : "Denoising Tier" ,
quick : "Quick" ,
balanced : "Balanced" ,
quality : "Quality" ,
maximum : "Maximum" ,
quickDesc : "Fast, lightweight" ,
balancedDesc : "Good quality, moderate speed" ,
qualityDesc : "AI-powered, slow" ,
maximumDesc : "Best AI model, slowest" ,
strength : "Strength" ,
subtle : "Subtle" ,
aggressive : "Aggressive" ,
detailPreservation : "Detail Preservation" ,
smooth : "Smooth" ,
sharp : "Sharp" ,
colorNoise : "Color Noise" ,
heavy : "Heavy" ,
outputFormat : "Output Format" ,
gifAiWarning :
"AI denoising on GIF files processes only the first frame. For animated GIFs, use the Quick or Balanced tier." ,
submit : "Remove Noise" ,
submitBatch : "Remove Noise ({count} files)" ,
progressLabel : "Removing noise" ,
progressLabelBatch : "Removing noise from {count} images" ,
},
"red-eye-removal" : {
sensitivity : "Sensitivity" ,
strict : "Strict" ,
aggressive : "Aggressive" ,
correctionStrength : "Correction Strength" ,
subtle : "Subtle" ,
dark : "Dark" ,
outputFormat : "Output Format" ,
quality : "Quality" ,
submit : "Fix Red Eye" ,
submitBatch : "Fix Red Eye ({count} files)" ,
progressLabel : "Fixing red eye" ,
progressLabelBatch : "Fixing red eye in {count} images" ,
},
"restore-photo" : {
scratchRemoval : "Scratch Removal" ,
scratchRemovalDesc : "Detect and repair scratches, tears, spots" ,
faceEnhancement : "Face Enhancement" ,
faceEnhancementDesc : "Restore degraded faces with CodeFormer AI" ,
faceFidelity : "Face Fidelity" ,
enhanced : "Enhanced" ,
faithful : "Faithful" ,
noiseReduction : "Noise Reduction" ,
noiseReductionDesc : "Remove grain and noise from old photos" ,
denoiseStrength : "Denoise Strength" ,
autoColorize : "Auto-Colorize" ,
autoColorizeDesc : "Add color to B&W photos using DDColor AI" ,
colorizeStrength : "Colorize Strength" ,
vivid : "Vivid" ,
submit : "Restore Photo" ,
submitBatch : "Restore Photos ({count})" ,
progressLabel : "Restoring photo" ,
progressLabelBatch : "Restoring {count} photos" ,
},
"content-aware-resize" : {
widthPx : "Width (px)" ,
heightPx : "Height (px)" ,
resizeToSquare : "Resize to square" ,
protectFaces : "Protect faces" ,
protectFacesHint : "Detect and protect face regions from seam removal using face detection" ,
smoothing : "Smoothing" ,
edgeSensitivity : "Edge sensitivity" ,
submit : "Resize" ,
submitBatch : "Resize ({count} files)" ,
progressLabel : "Content-aware resizing" ,
},
"ai-canvas-expand" : {
quality : "Quality" ,
fast : "Fast" ,
balanced : "Balanced" ,
highQuality : "High Quality" ,
fastDesc : "Quick preview, fewer AI passes" ,
balancedDesc : "Good quality, moderate speed" ,
highQualityDesc : "Best results, slower" ,
extendToAspectRatio : "Extend to aspect ratio" ,
extendByPixels : "Extend by (pixels)" ,
top : "Top" ,
right : "Right" ,
bottom : "Bottom" ,
left : "Left" ,
newSize : "New size: {width} x {height}" ,
submit : "Extend Canvas" ,
submitBatch : "Extend ({count} files)" ,
progressLabel : "Extending canvas" ,
},
colorize : {
aiModel : "AI Model" ,
fast : "Fast" ,
fastDesc : "Quick results" ,
balanced : "Balanced" ,
balancedDesc : "Best available" ,
best : "Best" ,
bestDesc : "Highest quality" ,
colorIntensity : "Color Intensity" ,
grayscaleLabel : "Grayscale" ,
subtleLabel : "Subtle" ,
naturalLabel : "Natural" ,
vividLabel : "Vivid" ,
intensityHint : "Lower values produce more muted, vintage-style colors." ,
strength : "Colorize Strength" ,
submit : "Colorize" ,
submitBatch : "Colorize ({count} files)" ,
progressLabel : "Colorizing" ,
progressLabelBatch : "Colorizing {count} images" ,
},
"passport-photo" : {
country : "Country" ,
searchCountries : "Search countries..." ,
noCountriesFound : "No countries found" ,
customDimensions : "Custom Dimensions" ,
documentType : "Document Type" ,
dimensionsMm : "Dimensions (mm)" ,
dpi : "DPI" ,
pixelsPerInch : "pixels per inch" ,
backgroundColor : "Background Color" ,
maxFileSize : "Max File Size" ,
noLimit : "No limit" ,
customKb : "Custom KB..." ,
uploadPortrait : "Upload a portrait photo" ,
uploadHint : "Drop or upload an image in the left panel to preview your passport photo" ,
analyzingPhoto : "Analyzing photo" ,
detectingLandmarks : "Detecting face landmarks and removing background..." ,
generatePassportPhoto : "Generate Passport Photo" ,
generating : "Generating..." ,
downloadPhoto : "Download Photo" ,
faceCentered : "Face centered" ,
headLevel : "Head level" ,
lookingStraight : "Looking straight" ,
faceSize : "Face size" ,
whatYouSee : "What you see is what you download" ,
dragToAdjust : "Drag to adjust" ,
scrollToZoom : "Scroll to zoom" ,
photoGenerated : "Photo generated. Download from the left panel." ,
},
"transparency-fixer" : {
description : "Upload a PNG with a fake transparent background and we'll fix it in one click." ,
removeWatermark : "Remove Watermark" ,
removeWatermarkHelp : "Detect and remove semi-transparent watermarks" ,
requiresEraser : "Requires Object Eraser bundle" ,
advanced : "Advanced" ,
defringe : "Defringe" ,
outputFormat : "Output Format" ,
submit : "Fix Transparency" ,
submitBatch : "Fix Transparency ({count} files)" ,
progressLabel : "Fixing transparency" ,
},
"watermark-text" : {
watermarkText : "Watermark Text" ,
fontSize : "Font Size" ,
color : "Color" ,
opacity : "Opacity" ,
position : "Position" ,
rotation : "Rotation" ,
center : "Center" ,
topLeft : "Top Left" ,
topRight : "Top Right" ,
bottomLeft : "Bottom Left" ,
bottomRight : "Bottom Right" ,
tiled : "Tiled" ,
submit : "Add Watermark" ,
submitBatch : "Add Watermark ({count} files)" ,
progressLabel : "Adding watermark" ,
},
"watermark-image" : {
uploadWatermark : "Upload Watermark Image" ,
position : "Position" ,
opacity : "Opacity" ,
scale : "Scale" ,
submit : "Apply Watermark" ,
submitBatch : "Apply Watermark ({count} files)" ,
},
"text-overlay" : {
text : "Text" ,
fontSize : "Font Size" ,
color : "Color" ,
position : "Position" ,
top : "Top" ,
center : "Center" ,
bottom : "Bottom" ,
backgroundBox : "Background Box" ,
backgroundColor : "Background Color" ,
shadow : "Shadow" ,
submit : "Add Text" ,
submitBatch : "Add Text ({count} files)" ,
progressLabel : "Adding text overlay" ,
},
compose : {
uploadOverlay : "Upload Overlay Image" ,
xPosition : "X Position" ,
yPosition : "Y Position" ,
opacity : "Opacity" ,
blendMode : "Blend Mode" ,
submit : "Compose" ,
},
"meme-generator" : {
selectTemplate : "Select a template from the gallery or upload your own image to get started." ,
chooseLayout : "Choose a text layout for your custom image." ,
textContent : "Text Content" ,
textStyle : "Text Style" ,
font : "Font" ,
fontSize : "Font Size" ,
textColor : "Text Color" ,
strokeColor : "Stroke Color" ,
allCaps : "ALL CAPS" ,
generate : "Generate Meme" ,
generating : "Generating..." ,
downloadMeme : "Download Meme" ,
backToGallery : "Back to Gallery" ,
},
info : {
loadingInfo : "Loading info..." ,
filename : "Filename" ,
fileSize : "File Size" ,
dimensions : "Dimensions" ,
format : "Format" ,
channels : "Channels" ,
colorSpace : "Color Space" ,
density : "Density" ,
bitDepth : "Bit Depth" ,
progressive : "Progressive" ,
pages : "Pages" ,
hasAlpha : "Has Alpha" ,
hasProfile : "Has Profile" ,
hasExif : "Has EXIF" ,
hasIcc : "Has ICC" ,
hasXmp : "Has XMP" ,
},
compare : {
uploadSecondImage : "Upload Second Image" ,
similarity : "Similarity: {percent}%" ,
submit : "Compare" ,
downloadDiff : "Download Diff" ,
},
"find-duplicates" : {
preset : "Preset" ,
exact : "Exact" ,
similar : "Similar" ,
loose : "Loose" ,
exactDesc : "Pixel-identical copies, same image in different formats." ,
similarDesc : "Resized, recompressed, or lightly edited copies." ,
looseDesc : "Visually related images, mild crops, different exposures." ,
threshold : "Threshold" ,
submit : "Scan for Duplicates" ,
scanning : "Scanning..." ,
},
"color-palette" : {
submit : "Extract Palette" ,
extracting : "Extracting..." ,
dominantColors : "Dominant Colors" ,
clickToCopy : "Click to copy" ,
},
"qr-generate" : {
contentType : "Content Type" ,
url : "URL" ,
text : "Text" ,
wifi : "WiFi" ,
vcard : "vCard" ,
email : "Email" ,
phone : "Phone" ,
sms : "SMS" ,
styling : "Styling" ,
dotStyle : "Dot Style" ,
cornerSquareStyle : "Corner Square Style" ,
cornerDotStyle : "Corner Dot Style" ,
foregroundColor : "Foreground Color" ,
bgColor : "Background Color" ,
logo : "Logo" ,
downloadFormat : "Download Format" ,
submit : "Generate QR Code" ,
download : "Download QR Code" ,
},
"barcode-read" : {
submit : "Scan Barcodes" ,
submitBatch : "Scan ({count} files)" ,
scanning : "Scanning..." ,
noBarcodesFound : "No barcodes found" ,
barcodesFound : "{count} barcode found" ,
barcodesFoundPlural : "{count} barcodes found" ,
},
collage : {
template : "Template" ,
aspectRatio : "Aspect Ratio" ,
gap : "Gap" ,
cornerRadius : "Corner Radius" ,
backgroundColor : "Background Color" ,
outputFormat : "Output Format" ,
quality : "Quality" ,
submit : "Create Collage" ,
downloadCollage : "Download Collage" ,
},
stitch : {
direction : "Direction" ,
horizontal : "Horizontal" ,
vertical : "Vertical" ,
grid : "Grid" ,
gridColumns : "Grid Columns" ,
resizeMode : "Resize Mode" ,
fit : "Fit" ,
original : "Original" ,
stretchMode : "Stretch" ,
cropMode : "Crop" ,
alignment : "Alignment" ,
start : "Start" ,
center : "Center" ,
end : "End" ,
gap : "Gap" ,
border : "Border" ,
cornerRadius : "Corner Radius" ,
backgroundColor : "Background Color" ,
outputFormat : "Output Format" ,
quality : "Quality" ,
submit : "Stitch Images" ,
},
split : {
modeGrid : "Grid" ,
modeTileSize : "Tile Size" ,
presets : "Presets" ,
columns : "Columns" ,
rows : "Rows" ,
tileWidth : "Tile Width" ,
tileHeight : "Tile Height" ,
outputFormat : "Output Format" ,
quality : "Quality" ,
submit : "Split Image" ,
downloadAll : "Download All (ZIP)" ,
},
border : {
presets : "Presets" ,
borderWidth : "Border Width" ,
borderColor : "Border Color" ,
padding : "Padding" ,
paddingColor : "Padding Color" ,
cornerRadius : "Corner Radius" ,
shadow : "Shadow" ,
shadowBlur : "Shadow Blur" ,
shadowOffsetX : "Shadow Offset X" ,
shadowOffsetY : "Shadow Offset Y" ,
shadowColor : "Shadow Color" ,
shadowOpacity : "Shadow Opacity" ,
submit : "Add Border" ,
submitBatch : "Add Border ({count} files)" ,
progressLabel : "Adding border" ,
},
beautify : {
preset : "Preset" ,
backgroundType : "Background Type" ,
solidColor : "Solid Color" ,
linearGradient : "Linear Gradient" ,
radialGradient : "Radial Gradient" ,
customImage : "Custom Image" ,
gradientAngle : "Gradient Angle" ,
padding : "Padding" ,
borderRadius : "Border Radius" ,
shadowPreset : "Shadow Preset" ,
deviceFrame : "Device Frame" ,
submit : "Beautify" ,
submitBatch : "Beautify ({count} files)" ,
progressLabel : "Beautifying screenshot" ,
},
"svg-to-raster" : {
outputFormat : "Output Format" ,
sizing : "Sizing" ,
scaleMode : "Scale" ,
customMode : "Custom" ,
scalePresets : "Scale Presets" ,
dpiPresets : "DPI Presets" ,
customWidth : "Width (px)" ,
customHeight : "Height (px)" ,
background : "Background" ,
bgTransparent : "Transparent" ,
bgColor : "Color" ,
quality : "Quality" ,
submit : "Convert SVG" ,
submitBatch : "Convert ({count} files)" ,
progressLabel : "Converting SVG" ,
},
vectorize : {
preset : "Preset" ,
logo : "Logo" ,
illustration : "Illustration" ,
photo : "Photo" ,
sketch : "Sketch" ,
customPreset : "Custom" ,
colorMode : "Color Mode" ,
bw : "B&W" ,
colorModeColor : "Color" ,
threshold : "Threshold" ,
colorPrecision : "Color Precision" ,
layerDifference : "Layer Difference" ,
filterSpeckle : "Filter Speckle" ,
pathMode : "Path Mode" ,
cornerThreshold : "Corner Threshold" ,
invertColors : "Invert colors" ,
submit : "Vectorize" ,
submitBatch : "Vectorize ({count} files)" ,
progressLabel : "Vectorizing" ,
},
"gif-tools" : {
mode : "Mode" ,
resize : "Resize" ,
optimize : "Optimize" ,
speed : "Speed" ,
reverse : "Reverse" ,
extract : "Extract" ,
rotateMode : "Rotate" ,
pixel : "Pixel" ,
percentage : "Percentage" ,
colors : "Colors" ,
dither : "Dither" ,
effort : "Effort" ,
speedFactor : "Speed Factor" ,
loopControl : "Loop Control" ,
infinite : "Infinite" ,
once : "Once" ,
customLoop : "Custom" ,
loopCount : "Loop Count" ,
extractSingle : "Single" ,
extractRange : "Range" ,
extractAll : "All" ,
frameNumber : "Frame Number" ,
frameStart : "Start Frame" ,
frameEnd : "End Frame" ,
extractFormat : "Format" ,
submit : "Process GIF" ,
submitBatch : "Process ({count} files)" ,
progressLabel : "Processing GIF" ,
},
"image-to-base64" : {
outputFormat : "Output Format" ,
keepOriginal : "Keep Original" ,
quality : "Quality" ,
maxWidth : "Max Width" ,
maxHeight : "Max Height" ,
submit : "Convert to Base64" ,
submitBatch : "Convert ({count} files)" ,
copyBase64 : "Copy Base64" ,
copyDataUri : "Copy Data URI" ,
copyImgTag : "Copy <img> Tag" ,
copyCssUrl : "Copy CSS url()" ,
},
"enhance-faces-standalone" : {
model : "Model" ,
fast : "Fast" ,
balanced : "Balanced" ,
best : "Best" ,
},
},
urlImport : {
title : "Import from URLs" ,
placeholder : "Paste image URLs, one per line..." ,
importButton : "Import URLs" ,
addButton : "Add {count} Files" ,
adding : "Adding..." ,
retryButton : "Retry" ,
cancelButton : "Cancel" ,
readyCount : "{count} ready" ,
failedStatus : "Failed" ,
},
comparison : {
original : "Original" ,
processed : "Processed" ,
before : "Before" ,
after : "After" ,
savings : "Savings" ,
},
toolPage : {
emptyPrompt : "Drop or upload an image to get started" ,
filesCount : "Files ({count})" ,
addMore : "+ Add more" ,
clearAll : "Clear all" ,
acceptDescription : "{exts} files only" ,
notFound : "Tool not found" ,
configureAndGenerate : "Configure settings and generate." ,
processingFailed : "Processing failed for this file" ,
conversionComplete : "Conversion complete" ,
cannotPreviewDownload :
"{type} files cannot be previewed in the browser. Use the download button to save your file." ,
generatingPreview : "Generating preview..." ,
cannotPreviewWillProcess :
"{ext} files cannot be previewed in the browser. The tool will still process this file normally." ,
previousImage : "Previous image" ,
nextImage : "Next image" ,
imageCounter : "{current} / {total}" ,
settingsLabel : "Settings" ,
downloadAllZip : "Download All (ZIP)" ,
hideSettings : "Hide Settings" ,
imageArea : "Image area" ,
},
homePage : {
generatingPreview : "Generating preview..." ,
loadingPreview : "Loading preview..." ,
changeFile : "Change file" ,
quickActions : "Quick Actions" ,
allTools : "All Tools" ,
},
fullscreenGrid : {
searchPlaceholder : "Search tools..." ,
hideDetails : "Hide Details" ,
showDetails : "Show Details" ,
switchToSidebar : "Switch to sidebar view" ,
sidebarButton : "Sidebar" ,
noToolsFound : "No tools found" ,
tryDifferent : "Try a different search term" ,
},
editor : {
menu : {
file : {
label : "File" ,
new : "New" ,
open : "Open" ,
save : "Save" ,
exportAs : "Export As..." ,
quickExportPng : "Quick Export as PNG" ,
close : "Close" ,
},
edit : {
label : "Edit" ,
undo : "Undo" ,
redo : "Redo" ,
cut : "Cut" ,
copy : "Copy" ,
copyMerged : "Copy Merged" ,
paste : "Paste" ,
pasteInPlace : "Paste in Place" ,
delete : "Delete" ,
freeTransform : "Free Transform" ,
transform : {
label : "Transform" ,
scale : "Scale" ,
rotate : "Rotate" ,
skew : "Skew" ,
flipHorizontal : "Flip Horizontal" ,
flipVertical : "Flip Vertical" ,
},
},
image : {
label : "Image" ,
imageSize : "Image Size..." ,
canvasSize : "Canvas Size..." ,
rotation : {
label : "Image Rotation" ,
cw90 : "90° CW" ,
ccw90 : "90° CCW" ,
r180 : "180°" ,
flipHorizontal : "Flip Horizontal" ,
flipVertical : "Flip Vertical" ,
},
trim : "Trim" ,
adjustments : {
label : "Adjustments" ,
brightnessContrast : "Brightness/Contrast" ,
hueSaturation : "Hue/Saturation" ,
colorBalance : "Color Balance" ,
levels : "Levels" ,
curves : "Curves" ,
},
},
layer : {
label : "Layer" ,
newLayer : "New Layer" ,
duplicateLayer : "Duplicate Layer" ,
deleteLayer : "Delete Layer" ,
arrange : {
label : "Arrange" ,
bringToFront : "Bring to Front" ,
bringForward : "Bring Forward" ,
sendBackward : "Send Backward" ,
sendToBack : "Send to Back" ,
},
mergeDown : "Merge Down" ,
flattenImage : "Flatten Image" ,
},
select : {
label : "Select" ,
all : "All" ,
deselect : "Deselect" ,
inverse : "Inverse" ,
colorRange : "Color Range..." ,
},
filter : {
label : "Filter" ,
blur : {
label : "Blur" ,
gaussian : "Gaussian Blur" ,
motion : "Motion Blur" ,
radial : "Radial Blur" ,
surface : "Surface Blur" ,
},
sharpen : {
label : "Sharpen" ,
sharpen : "Sharpen" ,
unsharpMask : "Unsharp Mask" ,
},
noise : {
label : "Noise" ,
addNoise : "Add Noise" ,
reduceNoise : "Reduce Noise" ,
},
pixelate : {
label : "Pixelate" ,
pixelate : "Pixelate" ,
mosaic : "Mosaic" ,
},
stylize : {
label : "Stylize" ,
emboss : "Emboss" ,
solarize : "Solarize" ,
posterize : "Posterize" ,
},
grayscale : "Grayscale" ,
sepia : "Sepia" ,
invert : "Invert" ,
},
view : {
label : "View" ,
zoomIn : "Zoom In" ,
zoomOut : "Zoom Out" ,
fitOnScreen : "Fit on Screen" ,
actualPixels : "Actual Pixels" ,
rulers : "Rulers" ,
grid : "Grid" ,
guides : "Guides" ,
snap : "Snap" ,
panels : "Panels" ,
},
},
menuBar : {
backTitle : "Back to SnapOtter" ,
},
welcome : {
ariaLabel : "Image drop zone" ,
heading : "Image Editor" ,
dropDescription : "Drop an image here to get started" ,
openImageButton : "Open Image" ,
newDocumentButton : "New Document" ,
pasteHint : "Or paste from clipboard (Ctrl+V)" ,
},
mobile : {
heading : "Desktop Recommended" ,
description :
"The image editor works best on desktop screens. Please switch to a device with a larger display for the full editing experience." ,
},
errors : {
serverDecodeFailed : "Server decode failed" ,
},
2026-05-09 11:31:36 +08:00
},
2026-03-22 04:42:19 +08:00
settings : {
2026-05-15 17:02:49 +08:00
heading : "Settings" ,
nav : {
general : "General" ,
systemSettings : "System Settings" ,
security : "Security" ,
people : "People" ,
teams : "Teams" ,
roles : "Roles" ,
auditLog : "Audit Log" ,
apiKeys : "API Keys" ,
aiFeatures : "AI Features" ,
tools : "Tools" ,
productAnalytics : "Product Analytics" ,
about : "About" ,
},
general : {
heading : "General" ,
description : "User preferences and display settings." ,
loading : "Loading..." ,
logOut : "Log out" ,
defaultToolViewLabel : "Default Tool View" ,
defaultToolViewDescription : "How tools are displayed on the home page" ,
sidebarOption : "Sidebar" ,
fullscreenGridOption : "Fullscreen Grid" ,
appVersionLabel : "App Version" ,
appVersionDescription : "Current version of SnapOtter" ,
saveButton : "Save Settings" ,
saveSuccess : "Settings saved." ,
saveFailed : "Failed to save settings." ,
},
system : {
heading : "System Settings" ,
description : "Server-side configuration and limits." ,
fileUploadLimitLabel : "File Upload Limit (MB)" ,
fileUploadLimitDescription : "Maximum file size per upload" ,
defaultThemeLabel : "Default Theme" ,
defaultThemeDescription : "Theme applied for new sessions" ,
lightOption : "Light" ,
darkOption : "Dark" ,
systemOption : "System" ,
languageLabel : "Language" ,
languageDescription : "Language for the interface" ,
loginAttemptLimitLabel : "Login Attempt Limit" ,
loginAttemptLimitDescription : "Max failed login attempts per minute before lockout" ,
fileManagementHeading : "File Management" ,
maxFileAgeLabel : "Max File Age (hours)" ,
maxFileAgeDescription : "How long processed files are kept before automatic cleanup" ,
startupCleanupLabel : "Startup Cleanup" ,
startupCleanupDescription : "Clean up old temporary files when the server starts" ,
saveButton : "Save Settings" ,
saveSuccess : "Settings saved." ,
saveFailed : "Failed to save settings." ,
limitsAndResources : "Limits & Resources" ,
maxFileSize : "Max File Size" ,
maxBatchSize : "Max Batch Size" ,
concurrentJobs : "Concurrent Jobs" ,
workerThreads : "Worker Threads" ,
maxPipelineSteps : "Max Pipeline Steps" ,
processingTimeout : "Processing Timeout" ,
rateLimitPerMin : "Rate Limit (req/min)" ,
unlimited : "Unlimited" ,
auto : "Auto" ,
envOverride : "Set by environment variable" ,
maxCanvasPixels : "Max Canvas Pixels" ,
maxSvgSize : "Max SVG Size" ,
maxSplitGrid : "Max Split Grid" ,
maxPdfPages : "Max PDF Pages" ,
sessionDuration : "Session Duration" ,
},
security : {
heading : "Security" ,
description : "Password and authentication settings." ,
changePasswordHeading : "Change Password" ,
currentPasswordPlaceholder : "Current Password" ,
newPasswordPlaceholder : "New Password" ,
confirmPasswordPlaceholder : "Confirm New Password" ,
passwordsMismatch : "Passwords do not match" ,
passwordTooShort : "Password must be at least 4 characters" ,
changeSuccess : "Password changed successfully" ,
changeFailed : "Failed to change password" ,
currentPasswordIncorrect : "Current password is incorrect" ,
changePasswordButton : "Change Password" ,
loginAttemptLimitNote : "Login attempt limits can be configured in System Settings." ,
},
people : {
heading : "People" ,
description : "Manage workspace members and their permissions" ,
userCount : "{count} user" ,
userCountPlural : "{count} users" ,
searchPlaceholder : "Search members..." ,
addMembersButton : "Add Members" ,
newMemberHeading : "New Member" ,
usernamePlaceholder : "Username" ,
passwordPlaceholder : "Password" ,
roleUserOption : "User" ,
roleEditorOption : "Editor" ,
roleAdminOption : "Admin" ,
roleUserDescription : "Basic tool access" ,
roleEditorDescription : "All files & pipelines" ,
roleAdminDescription : "Full access" ,
noDescription : "No description" ,
defaultTeamOption : "Default" ,
createButton : "Create" ,
cancelButton : "Cancel" ,
createSuccess : "User created successfully" ,
createFailed : "Failed to create user" ,
userLimitReached : "User limit reached ({max} max)" ,
deleteConfirm : 'Delete user "{username}"? This cannot be undone.' ,
deleteSuccess : 'User "{username}" deleted' ,
deleteFailed : "Failed to delete user" ,
editHeading : "Edit {username}" ,
updateSuccess : "User updated" ,
updateFailed : "Failed to update user" ,
cannotRemoveOwnAdmin : "Cannot remove your own admin role" ,
resetPasswordHeading : "Reset password for {username}" ,
newPasswordLabel : "New password (min 8 chars)" ,
resetPasswordButton : "Reset Password" ,
resetPasswordWarning : "This will invalidate all sessions and API keys for this user." ,
resetSuccess : "Password reset successfully" ,
resetFailed : "Failed to reset password" ,
tableHeaderUser : "User" ,
tableHeaderRole : "Role" ,
tableHeaderTeam : "Team" ,
noSearchResults : "No members match your search." ,
noUsersFound : "No users found." ,
authBadgeLocalOidc : "Local + OIDC" ,
authBadgeOidc : "OIDC" ,
editRoleTeamAction : "Edit Role / Team" ,
resetPasswordAction : "Reset Password" ,
deleteUserAction : "Delete User" ,
saveButton : "Save" ,
2026-05-16 23:08:19 +08:00
copyPasswordButton : "Copy password" ,
passwordCopied : "Copied!" ,
copyPasswordWarning :
"Copy this password now. You won't be able to see it after creating the user." ,
2026-05-15 17:02:49 +08:00
},
2026-03-25 09:36:16 +08:00
teams : {
2026-05-15 17:02:49 +08:00
heading : "Teams" ,
description : "Organize members into teams for better management." ,
createButton : "Create New Team" ,
newTeamHeading : "New Team" ,
teamNamePlaceholder : "Team name" ,
createSubmitButton : "Create" ,
cancelButton : "Cancel" ,
createSuccess : "Team created successfully" ,
createFailed : "Failed to create team" ,
duplicateTeamError : "A team with that name already exists" ,
renameSuccess : "Team renamed" ,
renameFailed : "Failed to rename team" ,
deleteConfirm : 'Delete team "{name}"? Members will be unassigned.' ,
deleteSuccess : 'Team "{name}" deleted' ,
deleteFailed : "Failed to delete team" ,
cannotDeleteDefault : "Cannot delete the default team or a team with members" ,
tableHeaderTeamName : "Team Name" ,
tableHeaderMembers : "Members" ,
emptyState : "No teams found." ,
renameSaveButton : "Save" ,
renameCancelButton : "Cancel" ,
renameAction : "Rename" ,
deleteAction : "Delete" ,
2026-03-25 09:36:16 +08:00
totalMembers : "Total Members" ,
nameRequired : "Team name is required" ,
nameTooLong : "Team name must be 50 characters or less" ,
duplicateName : "A team with this name already exists" ,
},
2026-05-15 17:02:49 +08:00
roles : {
heading : "Roles" ,
description : "Manage roles and their permissions. Built-in roles cannot be modified." ,
createButton : "Create Custom Role" ,
newRoleHeading : "New Role" ,
roleNamePlaceholder : "Role name" ,
descriptionPlaceholder : "Description (optional)" ,
permissionsLabel : "Permissions" ,
createSubmitButton : "Create" ,
cancelButton : "Cancel" ,
createSuccess : "Role created successfully" ,
createFailed : "Failed to create role" ,
duplicateRoleError : "A role with that name already exists" ,
editHeading : "Edit Role: {name}" ,
editSaveButton : "Save" ,
editCancelButton : "Cancel" ,
updateSuccess : "Role updated" ,
updateFailed : "Failed to update role" ,
deleteConfirm : 'Delete role "{name}"? {count} user(s) will need to be reassigned.' ,
deleteConfirmSimple : 'Delete role "{name}"?' ,
deleteSuccess : 'Role "{name}" deleted' ,
deleteFailed : "Failed to delete role" ,
emptyState : "No roles found." ,
builtInBadge : "Built-in" ,
userCountBadge : "{count} user(s)" ,
editRoleTitle : "Edit role" ,
deleteRoleTitle : "Delete role" ,
permGroup : {
tools : "Tools" ,
files : "Files" ,
apiKeys : "API Keys" ,
pipelines : "Pipelines" ,
settings : "Settings" ,
users : "Users" ,
teams : "Teams" ,
system : "System" ,
},
},
auditLog : {
heading : "Audit Log" ,
allActionsFilter : "All actions" ,
emptyState : "No audit log entries." ,
tableHeaderTime : "Time" ,
tableHeaderUser : "User" ,
tableHeaderAction : "Action" ,
tableHeaderTarget : "Target" ,
paginationInfo : "Page {page} of {totalPages} ({total} entries)" ,
previousButton : "Previous" ,
nextButton : "Next" ,
justNow : "just now" ,
minutesAgo : "{mins}m ago" ,
hoursAgo : "{hrs}h ago" ,
daysAgo : "{days}d ago" ,
},
apiKeys : {
heading : "API Keys" ,
description : "Manage API keys for programmatic access to SnapOtter." ,
keyNamePlaceholder : "Key name (optional)" ,
generateButton : "Generate API Key" ,
removeScopingLabel : "Remove permission scoping" ,
restrictPermissionsLabel : "Restrict permissions (optional)" ,
expiresLabel : "Expires:" ,
clearButton : "Clear" ,
copyTitle : "Copy" ,
keyWarning : "Store this key securely. It will not be shown again." ,
existingKeysHeading : "Existing Keys" ,
createdPrefix : "Created {date}" ,
scopedPrefix : "Scoped:" ,
expiresPrefix : "Expires {date}" ,
deleteKeyTitle : "Delete key" ,
deleteConfirm : "Delete this API key? Any integrations using it will stop working." ,
emptyState : "No API keys yet. Generate one to get started." ,
},
2026-03-25 09:36:16 +08:00
tools : {
2026-05-15 17:02:49 +08:00
heading : "Tools" ,
description : "Enable or disable individual tools. Disabled tools are hidden from all users." ,
restartBanner : "Restart required for changes to take effect." ,
2026-03-25 09:36:16 +08:00
searchPlaceholder : "Search tools..." ,
2026-05-15 17:02:49 +08:00
noSearchResults : "No tools match your search." ,
loadFailedError : "Failed to load tool settings. Saving is disabled to prevent data loss." ,
saveButton : "Save Tool Settings" ,
disabledCount : "{count} tool(s) disabled" ,
2026-03-25 09:36:16 +08:00
},
experimental : {
label : "Enable Experimental Tools" ,
description : "Show tools that are still in development. These may be unstable." ,
},
2026-05-15 17:02:49 +08:00
aiFeatures : {
title : "AI Features" ,
description : "Manage AI model bundles for advanced image processing." ,
installAll : "Install All" ,
diskUsage : "Disk usage: {size}" ,
installed : "Installed" ,
notInstalled : "Not installed" ,
queued : "Queued" ,
install : "Install" ,
repair : "Repair" ,
uninstall : "Uninstall" ,
installing : "Installing..." ,
},
2026-03-25 09:36:16 +08:00
fileManagement : {
title : "File Management" ,
maxAge : "Max File Age (hours)" ,
maxAgeDescription : "How long processed files are kept before automatic cleanup" ,
startupCleanup : "Startup Cleanup" ,
startupCleanupDescription : "Clean up old temporary files when the server starts" ,
},
2026-05-15 17:02:49 +08:00
analytics : {
heading : "Product Analytics" ,
description : "Share anonymous usage data to help improve SnapOtter." ,
2026-05-16 15:48:57 +08:00
privacyNote : "Your images never leave your network." ,
2026-05-15 17:02:49 +08:00
disabledByAdmin : "Product analytics has been disabled by the server administrator." ,
enabledLabel : "Analytics enabled" ,
disabledLabel : "Analytics disabled" ,
learnMore : "Learn more" ,
},
about : {
heading : "About" ,
appName : "SnapOtter" ,
appDescription :
2026-05-20 14:45:45 +08:00
"A self-hosted, privacy-first image processing suite with 50+ tools. Resize, compress, convert, watermark, and automate your image workflows without sending data to the cloud." ,
2026-05-15 17:02:49 +08:00
versionLabel : "Version:" ,
linksHeading : "Links" ,
githubLink : "GitHub Repository" ,
docsLink : "Documentation" ,
apiRefLink : "API Reference (Swagger)" ,
},
2026-03-22 04:42:19 +08:00
},
auth : {
login : "Login" ,
logout : "Log out" ,
username : "Username" ,
password : "Password" ,
loginButton : "Login" ,
loggingIn : "Logging in..." ,
invalidCredentials : "Invalid username or password" ,
connectionError : "Connection error" ,
2026-05-13 19:04:06 +08:00
signInWith : "Sign in with {provider}" ,
signInWithSso : "Sign in with SSO" ,
or : "or" ,
methodLocal : "Local" ,
methodOidc : "OIDC" ,
methodBoth : "Local + OIDC" ,
oidcAuthFailed : "Authentication failed. Please try again." ,
oidcProviderUnreachable : "Could not reach the identity provider. Please try again later." ,
oidcSessionExpired : "Login session expired. Please try again." ,
oidcUserNotAuthorized :
"Your account is not authorized to access this application. Contact your administrator." ,
oidcUserLimitReached : "User limit reached. Contact your administrator." ,
2026-05-15 17:02:49 +08:00
oidcGenericError : "Authentication error. Please try again." ,
2026-05-13 19:04:06 +08:00
passwordManagedByProvider : "Password changes are managed by your identity provider." ,
2026-05-15 17:02:49 +08:00
enterUsername : "Enter username" ,
enterPassword : "Enter your password" ,
heroTitle : "Your images. Stay yours." ,
heroSubtitle : "Every image tool you need." ,
rotatingPhrases : [
"No signups. No accounts." ,
"No uploads to the cloud. Ever." ,
"100% local processing." ,
"Free. Forever." ,
"No limits. No hidden caps." ,
"Works fully offline." ,
"Unlimited batch processing." ,
2026-05-20 14:45:45 +08:00
"50+ image tools." ,
2026-05-16 12:48:02 +08:00
"16 AI models. Your hardware." ,
2026-05-15 17:02:49 +08:00
"Lightning fast. Built on Sharp." ,
"Air-gapped ready." ,
"One Docker container." ,
"Open source. Always." ,
"Every pixel stays on your hardware." ,
"Your server. Your rules." ,
"Deploys in a single docker pull." ,
"The self-hosted alternative." ,
"Resize, compress, convert. Locally." ,
"Free image editor. No watermarks." ,
"Bulk image processing. Unlimited." ,
"Remove backgrounds offline." ,
"Self-hosted Canva alternative." ,
"No API keys needed." ,
"GDPR compliant by design." ,
"Works without internet." ,
],
2026-03-22 04:42:19 +08:00
},
2026-05-15 17:02:49 +08:00
changePassword : {
title : "Change your password" ,
description :
"You need to set a new password before continuing. Your password must be at least 8 characters with uppercase, lowercase, and a number." ,
usernameLabel : "Username" ,
currentPasswordLabel : "Current password" ,
currentPasswordPlaceholder : "Enter current password" ,
newPasswordLabel : "New password" ,
generateButton : "Generate strong password" ,
newPasswordPlaceholder : "At least 8 characters" ,
confirmPasswordLabel : "Confirm new password" ,
confirmPasswordPlaceholder : "Repeat new password" ,
passwordsMismatch : "Passwords do not match" ,
failedError : "Failed to change password" ,
connectionError : "Connection error" ,
changingButton : "Changing..." ,
changeButton : "Change password" ,
2026-05-16 22:45:22 +08:00
sidebarTitle : "Hello from the otter side!" ,
sidebarDescription : "Set a strong password to secure your account, then you're good to go." ,
2026-05-15 17:02:49 +08:00
},
automate : {
2026-03-22 04:42:19 +08:00
title : "Automate" ,
2026-05-15 17:02:49 +08:00
invalidPipelineFile : "Not a valid SnapOtter pipeline file" ,
newerVersion : "This pipeline was created with a newer version of SnapOtter" ,
missingName : "Pipeline file is missing a name" ,
noSteps : "Pipeline file has no steps" ,
importFailed : "Import failed" ,
couldNotRead : "Could not read pipeline file" ,
fileCount : "{count} file" ,
fileCountPlural : "{count} files" ,
importFromLibrary : "Import from Library" ,
addButton : "+ Add" ,
libraryButton : "Library" ,
clearButton : "Clear" ,
processingFailed : "Processing failed for this file" ,
processingMultiple : "Processing {count} files..." ,
processingPipeline : "Processing pipeline..." ,
processButton : "Process" ,
processButtonMultiple : "Process ({count})" ,
processAllButton : "Process All ({count})" ,
addTool : "Add Tool" ,
toolPalette : "Tool Palette" ,
clickToAdd : "Click to add to pipeline" ,
savedLabel : "Saved" ,
importButton : "Import" ,
noSavedPipelines : "No saved pipelines" ,
stepCount : "({count} step)" ,
stepCountPlural : "({count} steps)" ,
exportPipeline : "Export pipeline" ,
deletePipeline : "Delete pipeline" ,
moreCount : "+{count} more" ,
pipelineBuilder : "Pipeline Builder" ,
addToolsPrompt : "Add tools from the palette to get started" ,
stepsConfigured : "{count} step configured" ,
stepsConfiguredPlural : "{count} steps configured" ,
noFilesLoaded : "No files loaded" ,
downloadZip : "Download ZIP" ,
saveButton : "Save" ,
pipelineNamePlaceholder : "Pipeline name" ,
descriptionPlaceholder : "Description" ,
savingIndicator : "..." ,
cancelButton : "Cancel" ,
preview : "Preview" ,
previousImage : "Previous image" ,
nextImage : "Next image" ,
imageCounter : "{current} / {total}" ,
imageArea : "Image area" ,
templateSocialMedia : "Social Media Ready" ,
templatePrivacyClean : "Privacy Clean" ,
templateWebOptimization : "Web Optimization" ,
templateProfilePicture : "Profile Picture" ,
templateWatermarkBatch : "Watermark Batch" ,
2026-03-22 04:42:19 +08:00
createNew : "Create New Automation" ,
savedAutomations : "Saved Automations" ,
templates : "Templates" ,
addStep : "Add Step" ,
removeStep : "Remove" ,
moveUp : "Move up" ,
moveDown : "Move down" ,
savePipeline : "Save Pipeline" ,
runPipeline : "Process" ,
pipelineName : "Pipeline Name" ,
pipelineDescription : "Description (optional)" ,
2026-05-15 17:02:49 +08:00
noStepsPrompt : "Add steps to build your automation" ,
2026-03-22 04:42:19 +08:00
step : "Step" ,
},
nav : {
tools : "Tools" ,
reader : "Reader" ,
automate : "Automate" ,
2026-05-06 23:14:30 +08:00
editor : "Editor" ,
2026-03-22 04:42:19 +08:00
files : "Files" ,
help : "Help" ,
settings : "Settings" ,
2026-05-15 17:02:49 +08:00
grid : "Grid" ,
},
files : {
recentTab : "Recent" ,
uploadTab : "Upload" ,
fileDetailsAriaLabel : "File Details" ,
fileDetailsHeading : "File Details" ,
},
dropzone : {
unsupportedFileType : "This file type is not supported by this tool" ,
urlFetchFailed : "Could not fetch image from URL" ,
ariaLabel : "File drop zone" ,
dropPrompt : "Drop your images here" ,
browseOrPaste : "click anywhere to browse, or paste from clipboard" ,
uploadButton : "Upload" ,
defaultFormats : "PNG, JPG, WebP, HEIC, RAW, PSD, and 65+ formats" ,
orSeparator : "or" ,
urlPlaceholder : "Paste image URL..." ,
urlLoadingIndicator : "..." ,
addUrlButton : "Add" ,
importMultipleUrls : "Import multiple URLs..." ,
filesSelected : "{count} files selected" ,
},
reviewPanel : {
processedResultAlt : "Processed result" ,
sizeLabel : "Size: {size}" ,
typeLabel : "Type: {type}" ,
processedLabel : "Processed: {time}" ,
undoButton : "Undo" ,
downloadButton : "Download" ,
openInEditor : "Open in Editor" ,
reviewHeading : "Review" ,
continueEditing : "Continue editing" ,
},
features : {
notEnabledTitle : "Feature Not Enabled" ,
notEnabledDescription :
"This feature is not enabled. Ask your administrator to enable it in Settings." ,
requiresDownload : "This feature requires an additional download (~{size})" ,
retryButton : "Retry" ,
queued : "Queued for installation..." ,
enableButton : "Enable {name}" ,
lessThanMinute : "Less than a minute left" ,
oneMinuteLeft : "~1 minute left" ,
minutesLeft : "~{mins} minutes left" ,
progressMessages : [
"Almost there... probably..." ,
"Good things take time..." ,
"Still faster than watching paint dry..." ,
"Your patience is truly inspiring..." ,
"Working harder than it looks..." ,
"This is the exciting part, trust me..." ,
"Doing important behind-the-scenes stuff..." ,
"If you're reading this, it's working..." ,
"Preparing something awesome..." ,
"Worth every second, pinky promise..." ,
"The suspense is part of the experience..." ,
"Teaching your computer new tricks..." ,
"Setting up your superpowers..." ,
"Your images will thank you later..." ,
"Loading... but make it fancy..." ,
"This would be a great time for coffee..." ,
"Rome wasn't built in a day either..." ,
"Shhh... genius at work..." ,
"Making your photos jealous of what's coming..." ,
"Assembling the dream team..." ,
"Unpacking awesomeness..." ,
"Almost done thinking about starting... just kidding..." ,
"Plot twist: this is actually doing something..." ,
"Warming up the creative engines..." ,
"Imagination loading..." ,
"Not a screensaver, we promise..." ,
"Great art takes time to install..." ,
"Your future self will thank you..." ,
"Grabbing some really smart files..." ,
"Hang tight, the best is yet to come..." ,
],
},
help : {
heading : "Help" ,
gettingStarted : {
heading : "Getting Started" ,
description :
"Select a tool from the sidebar or search for one. Upload an image by dragging it onto the page or clicking the upload area. Adjust settings and download your result." ,
},
keyboardShortcuts : {
heading : "Keyboard Shortcuts" ,
focusSearchBar : "Focus search bar" ,
goToTools : "Go to tools" ,
toggleTheme : "Toggle theme" ,
goToResize : "Go to Resize" ,
goToCrop : "Go to Crop" ,
goToCompress : "Go to Compress" ,
goToConvert : "Go to Convert" ,
goToRemoveBackground : "Go to Remove Background" ,
goToWatermarkText : "Go to Watermark Text" ,
goToStripMetadata : "Go to Strip Metadata" ,
goToImageInfo : "Go to Image Info" ,
},
resources : {
heading : "Resources" ,
githubLink : "GitHub Repository" ,
reportIssueLink : "Report an Issue" ,
docsLink : "Documentation" ,
apiRefLink : "API Reference (Swagger)" ,
},
versionLabel : "SnapOtter v{version}" ,
},
errors : {
generic : "An error occurred" ,
offline : "You're offline" ,
reconnecting : "Reconnecting to server..." ,
connected : "Connected" ,
processingFailed : "Processing failed for this file" ,
timeout : "Request timed out. The server may be overloaded. Try again." ,
networkError : "Network error. Check your connection." ,
invalidCredentials : "Invalid username or password" ,
connectionError : "Connection error" ,
2026-03-22 04:42:19 +08:00
},
2026-04-22 18:58:16 +08:00
analytics : {
2026-04-24 18:02:21 +08:00
consentTitle : "Help improve SnapOtter" ,
2026-04-22 18:58:16 +08:00
consentDescription :
2026-05-16 15:48:57 +08:00
"Anonymous usage stats help us fix bugs and build the tools you actually need. Your images and files stay on your network." ,
2026-04-23 22:08:27 +08:00
consentChangeable : "You can turn this off anytime in Settings." ,
2026-04-22 18:58:16 +08:00
acceptButton : "Sure, sounds good" ,
2026-04-23 22:08:27 +08:00
declineButton : "Not right now" ,
2026-04-22 18:58:16 +08:00
settingsTitle : "Product Analytics" ,
2026-04-24 18:02:21 +08:00
settingsDescription : "Share anonymous usage data to help improve SnapOtter." ,
2026-05-16 15:48:57 +08:00
settingsPrivacy : "Your images never leave your network." ,
2026-04-22 18:58:16 +08:00
settingsDisabledByAdmin : "Product analytics has been disabled by the server administrator." ,
learnMore : "Learn more" ,
},
2026-05-15 17:02:49 +08:00
sidebar : {
tools : "Tools" ,
grid : "Grid" ,
automate : "Automate" ,
editor : "Editor" ,
files : "Files" ,
help : "Help" ,
settings : "Settings" ,
},
toolCard : {
addToFavourites : "Add to favourites" ,
},
appLayout : {
mobileNavTools : "Tools" ,
mobileNavAutomate : "Automate" ,
mobileNavEditor : "Editor" ,
mobileNavFiles : "Files" ,
mobileNavSettings : "Settings" ,
},
2026-03-22 04:42:19 +08:00
} as const ;
2026-05-15 17:02:49 +08:00
type DeepStringRecord < T > = {
readonly [ K in keyof T ] : T [ K ] extends string
? string
: T [ K ] extends readonly string []
? readonly string []
: DeepStringRecord < T [ K ] >;
};
export type TranslationKeys = DeepStringRecord < typeof en >;