Files
SnapOtter/packages/shared/src/i18n/en.ts
T
SnapOtter 0309e0f680 chore: deploy to Cloudflare Pages and update branding
- 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
2026-04-24 18:06:29 +08:00

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;