mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
- Add Cloudflare Pages deployment for landing page (snapotter.com) and docs (docs.snapotter.com) - Create deploy-landing.yml and update deploy-docs.yml workflows - Update CI to ignore apps/landing/** paths - Fix logo transparency (remove white background) across all apps - Recreate social-preview.png with SnapOtter branding - Update all docs URLs from GitHub Pages to docs.snapotter.com - Update VitePress config: light theme default, fix llms.txt paths - Add .vitepress/cache/ and .env.* to gitignore
320 lines
12 KiB
TypeScript
320 lines
12 KiB
TypeScript
/**
|
|
* English translations — the default / reference locale.
|
|
*
|
|
* Adding a new language is as simple as creating a new file (e.g. de.ts, fr.ts)
|
|
* that satisfies the same shape as `TranslationKeys`.
|
|
*/
|
|
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",
|
|
},
|
|
tools: {
|
|
resize: {
|
|
name: "Resize",
|
|
description: "Resize by pixels, percentage, or social media presets",
|
|
},
|
|
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" },
|
|
"optimize-for-web": {
|
|
name: "Optimize for Web",
|
|
description:
|
|
"Optimize images for web with format conversion, quality control, and live preview",
|
|
},
|
|
"strip-metadata": { name: "Remove Metadata", description: "Remove EXIF, GPS, and camera info" },
|
|
"edit-metadata": {
|
|
name: "Edit Metadata",
|
|
description: "Edit EXIF, IPTC, XMP, GPS, keywords, and dates",
|
|
},
|
|
"bulk-rename": { name: "Bulk Rename", description: "Rename multiple files with patterns" },
|
|
"image-to-pdf": { name: "Image to PDF", description: "Combine images into a PDF document" },
|
|
"pdf-to-image": { name: "PDF to Image", description: "Convert PDF pages to images" },
|
|
favicon: { name: "Favicon Generator", description: "Generate all favicon and app icon sizes" },
|
|
"adjust-colors": {
|
|
name: "Adjust Colors",
|
|
description:
|
|
"Brightness, contrast, exposure, saturation, temperature, sharpness, and effects",
|
|
},
|
|
sharpening: {
|
|
name: "Sharpening",
|
|
description: "Adaptive, unsharp mask, and high-pass sharpening with presets",
|
|
},
|
|
"replace-color": {
|
|
name: "Replace & Invert Color",
|
|
description: "Replace specific colors or invert",
|
|
},
|
|
"remove-background": {
|
|
name: "Remove Background",
|
|
description: "AI-powered background removal",
|
|
},
|
|
upscale: { name: "Image Upscaling", description: "AI super-resolution enhancement" },
|
|
"erase-object": { name: "Object Eraser", description: "Remove unwanted objects with AI" },
|
|
ocr: {
|
|
name: "OCR / Text Extraction",
|
|
description: "Extract text from images with AI-powered accuracy",
|
|
},
|
|
"blur-faces": {
|
|
name: "Face / PII Blur",
|
|
description: "Auto-detect and blur faces and sensitive info",
|
|
},
|
|
"enhance-faces": {
|
|
name: "Face Enhancement",
|
|
description: "Restore and enhance faces with AI",
|
|
},
|
|
"smart-crop": {
|
|
name: "Smart Crop",
|
|
description: "Smart subject, face, or trim-based cropping",
|
|
},
|
|
"image-enhancement": {
|
|
name: "Image Enhancement",
|
|
description:
|
|
"One-click auto-improve with smart exposure, contrast, color, and sharpness correction",
|
|
},
|
|
"noise-removal": {
|
|
name: "Noise Removal",
|
|
description: "AI-powered noise and grain removal",
|
|
},
|
|
"red-eye-removal": {
|
|
name: "Red Eye Removal",
|
|
description: "AI-powered red eye detection and correction for flash photos",
|
|
},
|
|
"restore-photo": {
|
|
name: "Photo Restoration",
|
|
description: "Fix scratches, tears, and damage on old photos with AI",
|
|
},
|
|
"content-aware-resize": {
|
|
name: "Content-Aware Resize",
|
|
description: "Intelligently resize images while preserving important content",
|
|
},
|
|
colorize: {
|
|
name: "AI Colorization",
|
|
description: "Convert black & white photos to full color using AI deep learning models",
|
|
},
|
|
"passport-photo": {
|
|
name: "Passport Photo",
|
|
description:
|
|
"Create government-compliant passport, visa, and ID photos with auto face detection",
|
|
},
|
|
"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" },
|
|
info: { name: "Image Info", description: "View all metadata and image properties" },
|
|
compare: { name: "Image Compare", description: "Side-by-side comparison of two images" },
|
|
"find-duplicates": {
|
|
name: "Find Duplicates",
|
|
description: "Detect duplicate and near-duplicate images",
|
|
},
|
|
"color-palette": { name: "Color Palette", description: "Extract dominant colors from image" },
|
|
"qr-generate": {
|
|
name: "QR Code Generator",
|
|
description: "Generate styled QR codes with custom colors, patterns, and logos",
|
|
},
|
|
"barcode-read": {
|
|
name: "Barcode Reader",
|
|
description: "Scan images for QR codes, barcodes, and 2D codes",
|
|
},
|
|
collage: {
|
|
name: "Collage / Grid",
|
|
description: "Combine images into beautiful grid collages with 25+ templates",
|
|
},
|
|
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",
|
|
},
|
|
"svg-to-raster": {
|
|
name: "SVG to Raster",
|
|
description:
|
|
"Convert SVG to PNG, JPEG, WebP, AVIF, TIFF, GIF, or HEIF at custom scale and DPI",
|
|
},
|
|
vectorize: { name: "Image to SVG", description: "Convert images to scalable vector graphics" },
|
|
"gif-tools": {
|
|
name: "GIF Tools",
|
|
description:
|
|
"Resize, optimize, change speed, reverse, extract frames, and rotate animated GIFs",
|
|
},
|
|
"image-to-base64": {
|
|
name: "Image to Base64",
|
|
description: "Convert images to base64 strings for embedding in HTML, CSS, and more",
|
|
},
|
|
pipeline: { name: "Pipeline Builder", description: "Chain multiple tools into a workflow" },
|
|
},
|
|
settings: {
|
|
title: "Settings",
|
|
general: "General",
|
|
system: "System Settings",
|
|
security: "Security",
|
|
apiKeys: "API Keys",
|
|
about: "About",
|
|
username: "Username",
|
|
logout: "Log out",
|
|
defaultView: "Default Tool View",
|
|
sidebarView: "Sidebar",
|
|
fullscreenView: "Fullscreen Grid",
|
|
version: "Version",
|
|
appName: "App Name",
|
|
uploadLimit: "File Upload Limit",
|
|
defaultTheme: "Default Theme",
|
|
defaultLocale: "Language",
|
|
changePassword: "Change Password",
|
|
currentPassword: "Current Password",
|
|
newPassword: "New Password",
|
|
confirmPassword: "Confirm Password",
|
|
passwordChanged: "Password changed successfully",
|
|
loginAttemptLimit: "Login Attempt Limit",
|
|
generateKey: "Generate API Key",
|
|
regenerateKey: "Regenerate",
|
|
copyKey: "Copy Key",
|
|
aboutDescription:
|
|
"SnapOtter is a self-hosted, privacy-first image processing suite with 30+ tools.",
|
|
aboutLinks: "Links",
|
|
github: "GitHub",
|
|
documentation: "Documentation",
|
|
teams: {
|
|
title: "Teams",
|
|
description: "Manage teams and organize workspace members",
|
|
createTeam: "Create New Team",
|
|
teamName: "Team Name",
|
|
totalMembers: "Total Members",
|
|
rename: "Rename",
|
|
delete: "Delete",
|
|
deleteConfirm: "Are you sure you want to delete this team?",
|
|
cannotDeleteDefault: "Cannot delete the Default team",
|
|
cannotDeleteWithMembers: "Cannot delete a team with assigned members",
|
|
namePlaceholder: "Enter team name",
|
|
nameRequired: "Team name is required",
|
|
nameTooLong: "Team name must be 50 characters or less",
|
|
duplicateName: "A team with this name already exists",
|
|
},
|
|
tools: {
|
|
title: "Tools",
|
|
description: "Enable or disable tools for all users",
|
|
searchPlaceholder: "Search tools...",
|
|
enabled: "Enabled",
|
|
disabled: "Disabled",
|
|
restartRequired: "Restart required for changes to take effect",
|
|
toolUnavailable: "Tool unavailable",
|
|
},
|
|
experimental: {
|
|
label: "Enable Experimental Tools",
|
|
description: "Show tools that are still in development. These may be unstable.",
|
|
},
|
|
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",
|
|
},
|
|
branding: {
|
|
logo: "Custom Logo",
|
|
logoDescription: "Upload a custom logo for the sidebar and navbar",
|
|
uploadLogo: "Upload Logo",
|
|
removeLogo: "Remove Logo",
|
|
logoRequirements: "PNG, SVG, or JPEG. Max 500KB.",
|
|
dragDrop: "Drag and drop or click to upload",
|
|
},
|
|
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",
|
|
disabled: "Disabled",
|
|
envOverride: "Set by environment variable",
|
|
maxCanvasPixels: "Max Canvas Pixels",
|
|
maxSvgSize: "Max SVG Size",
|
|
maxLogoSize: "Max Logo Size",
|
|
maxSplitGrid: "Max Split Grid",
|
|
maxPdfPages: "Max PDF Pages",
|
|
sessionDuration: "Session Duration",
|
|
},
|
|
auth: {
|
|
login: "Login",
|
|
logout: "Log out",
|
|
username: "Username",
|
|
password: "Password",
|
|
loginButton: "Login",
|
|
loggingIn: "Logging in...",
|
|
invalidCredentials: "Invalid username or password",
|
|
connectionError: "Connection error",
|
|
},
|
|
pipeline: {
|
|
title: "Automate",
|
|
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)",
|
|
noSteps: "Add steps to build your automation",
|
|
step: "Step",
|
|
settings: "Settings",
|
|
processing: "Processing pipeline...",
|
|
socialMediaReady: "Social Media Ready",
|
|
privacyClean: "Privacy Clean",
|
|
webOptimization: "Web Optimization",
|
|
profilePicture: "Profile Picture",
|
|
watermarkBatch: "Watermark Batch",
|
|
},
|
|
nav: {
|
|
tools: "Tools",
|
|
reader: "Reader",
|
|
automate: "Automate",
|
|
files: "Files",
|
|
help: "Help",
|
|
settings: "Settings",
|
|
},
|
|
analytics: {
|
|
consentTitle: "Help improve SnapOtter",
|
|
consentDescription:
|
|
"Anonymous usage stats help us fix bugs and build the tools you actually need. Your images and files stay on your machine.",
|
|
consentChangeable: "You can turn this off anytime in Settings.",
|
|
acceptButton: "Sure, sounds good",
|
|
declineButton: "Not right now",
|
|
settingsTitle: "Product Analytics",
|
|
settingsDescription: "Share anonymous usage data to help improve SnapOtter.",
|
|
settingsPrivacy: "Your images never leave your machine.",
|
|
settingsDisabledByAdmin: "Product analytics has been disabled by the server administrator.",
|
|
learnMore: "Learn more",
|
|
},
|
|
} as const;
|
|
|
|
export type TranslationKeys = typeof en;
|