Files
SnapOtter/packages/shared/src/i18n/es.ts
T
SnapOtter d38621d7b9 feat: add multi-language support for 20 locales
Add complete i18n infrastructure with 21 supported languages:
English, Simplified Chinese, Traditional Chinese, Japanese, Korean,
Spanish, French, Italian, Brazilian Portuguese, German, Dutch, Swedish,
Russian, Polish, Ukrainian, Arabic (RTL), Turkish, Hindi, Vietnamese,
Indonesian, and Thai.

- I18nProvider context with three-tier locale detection
  (user preference > navigator.languages > instance default > English)
- ~1500 translation keys per locale with TypeScript-enforced completeness
- Dynamic code-splitting: only the active locale is loaded at runtime
- Language selectors in footer, login page, settings, and mobile sidebar
- Arabic RTL support with CSS logical properties across all components
- Tool names, descriptions, and categories translated via i18n helpers
- Public API endpoint GET /api/v1/config/locale for instance default
- Multi-script font stack (CJK, Arabic, Devanagari, Thai, Cyrillic)
- format() and plural() helpers for interpolation and pluralization
- API error translation mapping (translateApiError)
- 36 Playwright e2e tests verifying all 21 locales load correctly
- 25 unit tests for format, plural, locale detection, and completeness
- Updated translations.md docs and CLAUDE.md conventions
2026-05-15 17:02:49 +08:00

1967 lines
73 KiB
TypeScript

import type { TranslationKeys } from "./en.js";
export const es: TranslationKeys = {
common: {
upload: "Subir desde la computadora",
process: "Procesar",
download: "Descargar",
cancel: "Cancelar",
save: "Guardar",
delete: "Eliminar",
settings: "Configuracion",
search: "Buscar herramientas...",
dropFiles: "Arrastra archivos aqui o haz clic en el boton de carga",
loading: "Cargando...",
error: "Ocurrio un error",
confirm: "Confirmar",
close: "Cerrar",
back: "Atras",
next: "Siguiente",
clear: "Limpiar",
copy: "Copiar",
copied: "Copiado!",
noResults: "No se encontraron resultados",
showLess: "Mostrar menos",
showMore: "Mostrar {count} mas",
experimental: "Experimental",
enabled: "Activado",
disabled: "Desactivado",
rename: "Renombrar",
edit: "Editar",
actions: "Acciones",
create: "Crear",
or: "o",
goHome: "Ir al inicio",
somethingWentWrong: "Algo salio mal",
unexpectedError: "Ocurrio un error inesperado.",
retry: "Reintentar",
privacyPolicy: "Politica de privacidad",
},
categories: {
essentials: "Esenciales",
optimization: "Optimizacion",
adjustments: "Ajustes",
watermark: "Marca de agua y superposicion",
utilities: "Utilidades",
layout: "Diseno y composicion",
format: "Formato y conversion",
ai: "Herramientas de AI",
},
tools: {
resize: {
name: "Redimensionar",
description: "Redimensiona por pixeles, porcentaje o presets de redes sociales",
},
crop: {
name: "Recortar",
description: "Recorte libre, relaciones de aspecto, recorte con forma",
},
rotate: { name: "Rotar y voltear", description: "Rota, voltea y endereza imagenes" },
convert: { name: "Convertir", description: "Convierte entre formatos de imagen" },
compress: {
name: "Comprimir",
description: "Reduce el tamano del archivo por calidad o tamano objetivo",
},
"optimize-for-web": {
name: "Optimizar para web",
description:
"Optimiza imagenes para web con conversion de formato, control de calidad y vista previa en vivo",
},
"strip-metadata": {
name: "Eliminar metadatos",
description: "Elimina EXIF, GPS e informacion de la camara",
},
"edit-metadata": {
name: "Editar metadatos",
description: "Edita EXIF, IPTC, XMP, GPS, palabras clave y fechas",
},
"bulk-rename": {
name: "Renombrado masivo",
description: "Renombra multiples archivos con patrones",
},
"image-to-pdf": {
name: "Imagen a PDF",
description: "Combina imagenes en un documento PDF",
},
"pdf-to-image": { name: "PDF a imagen", description: "Convierte paginas PDF a imagenes" },
favicon: {
name: "Generador de Favicon",
description: "Genera todos los tamanos de favicon e iconos de app",
},
"adjust-colors": {
name: "Ajustar colores",
description: "Brillo, contraste, exposicion, saturacion, temperatura, nitidez y efectos",
},
sharpening: {
name: "Enfoque",
description: "Enfoque adaptativo, mascara de desenfoque y paso alto con presets",
},
"replace-color": {
name: "Reemplazar e invertir color",
description: "Reemplaza colores especificos o invierte",
},
"color-blindness": {
name: "Simulacion de daltonismo",
description:
"Simula como se ven las imagenes con diferentes tipos de deficiencia de vision del color",
},
"remove-background": {
name: "Eliminar fondo",
description: "Eliminacion de fondo con AI",
},
upscale: { name: "Escalar imagen", description: "Mejora de super-resolucion con AI" },
"erase-object": {
name: "Borrador de objetos",
description: "Elimina objetos no deseados con AI",
},
ocr: {
name: "OCR / Extraccion de texto",
description: "Extrae texto de imagenes con precision potenciada por AI",
},
"blur-faces": {
name: "Desenfocar rostros / datos sensibles",
description: "Detecta y desenfoca rostros e informacion sensible automaticamente",
},
"enhance-faces": {
name: "Mejora de rostros",
description: "Restaura y mejora rostros con AI",
},
"smart-crop": {
name: "Recorte inteligente",
description: "Recorte inteligente por sujeto, rostro o bordes",
},
"image-enhancement": {
name: "Mejora de imagen",
description:
"Mejora automatica con un clic: exposicion, contraste, color y nitidez inteligentes",
},
"noise-removal": {
name: "Eliminacion de ruido",
description: "Eliminacion de ruido y grano con AI",
},
"red-eye-removal": {
name: "Eliminacion de ojos rojos",
description: "Deteccion y correccion de ojos rojos con AI para fotos con flash",
},
"restore-photo": {
name: "Restauracion de fotos",
description: "Repara rasguños, roturas y daños en fotos antiguas con AI",
},
"content-aware-resize": {
name: "Redimension consciente del contenido",
description: "Redimensiona imagenes de forma inteligente preservando el contenido importante",
},
"ai-canvas-expand": {
name: "Expandir lienzo con AI",
description: "Expande el lienzo con relleno generado por AI",
},
colorize: {
name: "Colorizacion con AI",
description:
"Convierte fotos en blanco y negro a color usando modelos de aprendizaje profundo con AI",
},
"passport-photo": {
name: "Foto de pasaporte",
description:
"Crea fotos de pasaporte, visa e identificacion que cumplen con los requisitos oficiales, con deteccion automatica de rostro",
},
"transparency-fixer": {
name: "Corrector de transparencia PNG",
description: "Corrige PNGs con transparencia falsa en un clic",
},
"watermark-text": {
name: "Marca de agua de texto",
description: "Agrega una marca de agua de texto",
},
"watermark-image": {
name: "Marca de agua de imagen",
description: "Superpone un logo como marca de agua",
},
"text-overlay": {
name: "Texto superpuesto",
description: "Agrega texto con estilo a las imagenes",
},
compose: {
name: "Composicion de imagen",
description: "Superpone imagenes con posicion y opacidad",
},
"meme-generator": {
name: "Generador de Meme",
description:
"Crea memes con plantillas populares o tus propias imagenes. Texto clasico estilo Impact con fuentes, colores y posicion personalizables.",
},
info: {
name: "Info de imagen",
description: "Ve todos los metadatos y propiedades de la imagen",
},
compare: { name: "Comparar imagenes", description: "Comparacion lado a lado de dos imagenes" },
"find-duplicates": {
name: "Buscar duplicados",
description: "Detecta imagenes duplicadas y casi duplicadas",
},
"color-palette": {
name: "Paleta de colores",
description: "Extrae los colores dominantes de una imagen",
},
"qr-generate": {
name: "Generador de codigos QR",
description: "Genera codigos QR con estilos, colores personalizados, patrones y logos",
},
"barcode-read": {
name: "Lector de codigos de barras",
description: "Escanea imagenes en busca de codigos QR, codigos de barras y codigos 2D",
},
collage: {
name: "Collage / Cuadricula",
description: "Combina imagenes en hermosos collages con mas de 25 plantillas",
},
stitch: {
name: "Unir / Combinar",
description: "Une imagenes lado a lado, apiladas o en cuadricula",
},
split: {
name: "Dividir imagen",
description: "Divide imagenes en cuadricula o por tamano en pixeles con vista previa en vivo",
},
border: {
name: "Borde y marco",
description: "Agrega bordes, relleno, esquinas redondeadas y sombras con presets de un clic",
},
beautify: {
name: "Embellecer captura de pantalla",
description:
"Agrega fondos degradados, marcos de dispositivo, sombras y tamanos de redes sociales a capturas de pantalla",
},
"svg-to-raster": {
name: "SVG a raster",
description:
"Convierte SVG a PNG, JPEG, WebP, AVIF, TIFF, GIF o HEIF a escala y DPI personalizados",
},
vectorize: {
name: "Imagen a SVG",
description: "Convierte imagenes a graficos vectoriales escalables",
},
"gif-tools": {
name: "Herramientas GIF",
description:
"Redimensiona, optimiza, cambia velocidad, invierte, extrae fotogramas y rota GIFs animados",
},
"image-to-base64": {
name: "Imagen a Base64",
description: "Convierte imagenes a cadenas Base64 para incrustar en HTML, CSS y mas",
},
pipeline: {
name: "Constructor de Pipeline",
description: "Encadena multiples herramientas en un flujo de trabajo",
},
},
toolSettings: {
compress: {
compressionMode: "Modo de compresion",
targetSize: "Tamano objetivo",
quality: "Calidad",
smallestFile: "Archivo mas pequeno",
bestQuality: "Mejor calidad",
submit: "Comprimir",
submitBatch: "Comprimir ({count} archivos)",
progressLabel: "Comprimiendo",
original: "Original: {size} KB",
processed: "Procesado: {size} KB",
saved: "Ahorro: {percent}%",
},
resize: {
customSize: "Tamano personalizado",
scale: "Escala",
presets: "Presets",
contentAware: "Consciente del contenido",
widthPx: "Ancho (px)",
heightPx: "Alto (px)",
fitMode: "Modo de ajuste",
cropToFit: "Recortar para ajustar",
fitInside: "Ajustar dentro",
stretch: "Estirar",
limitToOriginalSize: "Limitar al tamano original",
limitToOriginalSizeHint:
"Si tu imagen ya es mas pequena que el objetivo, se mantiene como esta en lugar de escalarla",
scalePercent: "Escala (%)",
resizeToSquare: "Redimensionar a cuadrado",
protectFaces: "Proteger rostros",
smoothing: "Suavizado",
edgeSensitivity: "Sensibilidad de bordes",
submit: "Redimensionar",
submitBatch: "Redimensionar ({count} archivos)",
progressLabel: "Redimensionando",
},
crop: {
aspectRatio: "Relacion de aspecto",
custom: "Personalizado",
positionAndSize: "Posicion y tamano",
ruleOfThirds: "Regla de tercios",
leftOffsetPx: "Desplazamiento izquierdo (px)",
topOffsetPx: "Desplazamiento superior (px)",
submit: "Recortar",
submitBatch: "Recortar ({count} archivos)",
progressLabel: "Recortando",
},
rotate: {
rotate: "Rotar",
angle: "Angulo",
straighten: "Enderezar",
flip: "Voltear",
horizontal: "Horizontal",
vertical: "Vertical",
resetAllChanges: "Restablecer todos los cambios",
submit: "Aplicar",
submitBatch: "Aplicar ({count} archivos)",
progressLabel: "Aplicando",
},
convert: {
targetFormat: "Formato de destino",
sourceFormat: "Formato de origen",
quality: "Calidad",
submit: "Convertir",
submitBatch: "Convertir ({count} archivos)",
progressLabel: "Convirtiendo",
},
"optimize-for-web": {
outputFormat: "Formato de salida",
quality: "Calidad",
smallestFile: "Archivo mas pequeno",
bestQuality: "Mejor calidad",
maxDimensions: "Dimensiones maximas",
maxWidth: "Ancho maximo",
maxHeight: "Alto maximo",
stripMetadata: "Eliminar metadatos",
sizeComparison: "Comparacion de tamano",
optimized: "Optimizado:",
smaller: "{percent}% mas pequeno",
larger: "{percent}% mas grande",
submit: "Procesar y descargar",
submitBatch: "Procesar y descargar ({count} archivos)",
progressLabel: "Optimizando",
},
"strip-metadata": {
currentMetadata: "Metadatos actuales",
readingMetadata: "Leyendo metadatos...",
noMetadataFound: "No se encontraron metadatos en esta imagen.",
removeAllMetadata: "Eliminar todos los metadatos",
selectSpecific: "O selecciona metadatos especificos:",
stripExif: "Eliminar EXIF (info de camara, fecha, exposicion)",
stripGps: "Eliminar GPS (datos de ubicacion)",
stripIcc: "Eliminar ICC (perfil de color)",
stripXmp: "Eliminar XMP (metadatos extensibles)",
locationFound: "ubicacion encontrada",
locationWarning:
"Esta imagen contiene tu ubicacion precisa. Considera eliminar los datos GPS antes de compartirla.",
metadataSections: "{count} seccion de metadatos encontrada",
metadataSectionsPlural: "{count} secciones de metadatos encontradas",
metadataRemoved: "Metadatos eliminados: {size} KB",
submit: "Eliminar metadatos",
progressLabel: "Eliminando metadatos",
},
"edit-metadata": {
readingMetadata: "Leyendo metadatos...",
couldNotReadMetadata: "No se pudieron leer los metadatos - los campos comenzaran vacios.",
basicInfo: "Informacion basica",
description: "Descripcion",
artist: "Artista",
copyright: "Copyright",
software: "Software",
iptc: "IPTC",
title: "Titulo",
headline: "Titular",
city: "Ciudad",
stateProvince: "Estado/Provincia",
country: "Pais",
dateAndTime: "Fecha y hora",
editDates: "Editar fechas",
shiftAllDates: "Ajustar todas las fechas",
dateModified: "Fecha de modificacion",
dateTaken: "Fecha de captura",
shiftHint:
"Ajusta todos los campos de fecha con un desfase (util para correcciones de zona horaria)",
direction: "Direccion",
forward: "+ Adelante",
backward: "- Atras",
hoursMinutes: "Horas:Minutos",
locationGps: "Ubicacion (GPS)",
locationDataFound: "Datos de ubicacion encontrados",
noGpsData: "Sin datos GPS. Agrega coordenadas abajo.",
latitude: "Latitud",
longitude: "Longitud",
altitudeMeters: "Altitud (metros)",
removeAllGpsData: "Eliminar todos los datos GPS",
keywords: "Palabras clave",
addKeywordPlaceholder: "Agregar palabra clave y presionar Enter",
addToExisting: "Agregar a las existentes",
replaceAll: "Reemplazar todas",
allMetadata: "Todos los metadatos",
templates: "Plantillas",
templateNamePlaceholder: "Nombre de la plantilla",
uploadPrompt: "Sube una imagen para editar sus metadatos.",
changes: "{count} cambios:",
modified: "{count} modificados",
removed: "{count} eliminados",
gpsCleared: "GPS eliminado",
gpsAdded: "GPS agregado",
datesShifted: "fechas ajustadas",
submit: "Aplicar metadatos",
progressLabel: "Escribiendo metadatos",
},
"bulk-rename": {
pattern: "Patron",
patternHint: "Variables: {{index}}, {{padded}}, {{original}}",
startIndex: "Indice inicial",
preview: "Vista previa",
andMore: "... y {count} mas",
renaming: "Renombrando...",
submit: "Renombrar {count} archivos",
zipDownloaded: "ZIP descargado correctamente",
},
"image-to-pdf": {
imageCount: "{count} imagen se convertira a {mode}",
imageCountPlural: "{count} imagenes se convertiran a {mode}",
singlePdfMode: "un solo PDF, una imagen por pagina",
separatePdfMode: "PDFs separados, uno por imagen",
combineAllImages: "Combinar todas las imagenes en un PDF",
pageSize: "Tamano de pagina",
orientation: "Orientacion",
portrait: "Vertical",
landscape: "Horizontal",
margin: "Margen",
targetSizeLabel: "Tamano de archivo objetivo (opcional)",
targetSizePlaceholder: "ej. 2",
targetSizeHint: "Dejar vacio para calidad maxima",
targetSizeMet: "Objetivo alcanzado",
targetSizeNotMet: "No se pudo alcanzar el objetivo. Archivo comprimido a calidad minima.",
targetSizeTooSmall: "El objetivo debe ser al menos 50KB",
jpegQualityLabel: "Calidad JPEG utilizada",
noImage: "Sin imagen",
submitCollate: "Crear PDF ({count} paginas)",
submitSeparate: "Crear {count} PDFs",
downloadPdf: "Descargar PDF",
downloadZip: "Descargar ZIP",
progressLabel: "Creando PDF",
uploadingImages: "Subiendo imagenes...",
processingPages: "Procesando {count} paginas...",
},
"pdf-to-image": {
dropPdf: "Arrastra un PDF aqui o haz clic para seleccionar",
readingPdf: "Leyendo PDF...",
pageCount: "{count} pagina",
pageCountPlural: "{count} paginas",
outputFormat: "Formato de salida",
quality: "Calidad",
resolutionDpi: "Resolucion (DPI)",
dpiScreen: "Pantalla",
dpiStandard: "Estandar",
dpiPrint: "Impresion",
dpiHighQuality: "Alta calidad",
colorMode: "Modo de color",
colorModeColor: "Color",
colorModeGrayscale: "Escala de grises",
colorModeBw: "B&N",
pages: "Paginas",
allPages: "Todas las paginas",
pagesHint: "ej. 1-3, 5, 8-10 (el documento tiene {count} paginas)",
converting: "Convirtiendo...",
submit: "Convertir {count} pagina",
submitPlural: "Convertir {count} paginas",
downloadAllZip: "Descargar todo (ZIP)",
},
favicon: {
uploadHint:
"Sube imagenes cuadradas (se recomienda 512x512 o mayor) para generar todos los tamanos de favicon e iconos de app.",
multipleHint: "Cada una de las {count} imagenes obtiene su propia carpeta en el ZIP.",
generatedSizes: "Tamanos generados (por imagen)",
plusManifest: "+ manifest.json + fragmento HTML",
submit: "Generar Favicons ({count} imagen)",
submitPlural: "Generar Favicons ({count} imagenes)",
downloadZip: "Descargar ZIP de Favicons",
progressLabel: "Generando Favicons",
},
"adjust-colors": {
light: "Luz",
brightness: "Brillo",
contrast: "Contraste",
exposure: "Exposicion",
color: "Color",
saturation: "Saturacion",
temperature: "Temperatura",
temperatureHint: "frio / calido",
tint: "Tono",
tintHint: "verde / magenta",
hue: "Matiz",
detail: "Detalle",
sharpness: "Nitidez",
effects: "Efectos",
none: "ninguno",
grayscale: "escala de grises",
sepia: "sepia",
invert: "invertir",
colorChannels: "Canales de color",
channelModified: "modificado",
red: "Rojo",
green: "Verde",
blue: "Azul",
resetAll: "Restablecer todo",
submit: "Aplicar",
submitBatch: "Aplicar ({count} archivos)",
progressLabel: "Ajustando colores",
},
sharpening: {
method: "Metodo",
adaptive: "Adaptativo",
unsharpMask: "Mascara de desenfoque",
highPass: "Paso alto",
presets: "Presets",
textureAmount: "Cantidad de textura",
amount: "Cantidad",
strength: "Intensidad",
noiseReduction: "Reduccion de ruido",
off: "desactivado",
lightDenoise: "ligero",
mediumDenoise: "medio",
strongDenoise: "fuerte",
advancedControls: "Controles avanzados",
radius: "Radio",
flatProtection: "Proteccion de areas planas",
detailThreshold: "Umbral de detalle",
haloLimitLight: "Limite de halo (claro)",
haloLimitDark: "Limite de halo (oscuro)",
threshold: "Umbral",
kernelSize: "Tamano del kernel",
submit: "Enfocar",
submitBatch: "Enfocar ({count} archivos)",
progressLabel: "Enfocando",
},
"replace-color": {
sourceColor: "Color de origen (a reemplazar)",
targetColor: "Color de destino (reemplazo)",
makeTransparent: "Hacer transparente en su lugar",
tolerance: "Tolerancia",
exactMatch: "Coincidencia exacta",
wideRange: "Rango amplio",
submit: "Reemplazar color",
submitBatch: "Reemplazar color ({count} archivos)",
progressLabel: "Reemplazando color",
},
"color-blindness": {
simulationType: "Tipo de simulacion",
redGreen: "Rojo-Verde",
blueYellow: "Azul-Amarillo",
monochromatic: "Monocromatico",
submit: "Simular",
submitBatch: "Simular ({count} archivos)",
progressLabel: "Simulando daltonismo",
},
"remove-background": {
subject: "Sujeto",
people: "Personas",
products: "Productos",
general: "General",
passportIdPhoto: "Foto de pasaporte / identificacion",
quality: "Calidad",
fast: "Rapido",
hd: "HD",
max: "Max",
ultra: "Ultra",
background: "Fondo",
transparent: "Transparente",
bgColor: "Color",
gradient: "Degradado",
image: "Imagen",
gradientDirection: "Direccion",
chooseBackgroundImage: "Elegir imagen de fondo",
effectsSection: "Efectos",
effectsActive: "activos",
blurBackground: "Desenfocar fondo",
intensity: "Intensidad",
addShadow: "Agregar sombra",
opacity: "Opacidad",
rendering: "Renderizando...",
submit: "Eliminar fondo",
submitBatch: "Eliminar fondo ({count} archivos)",
progressLabel: "Eliminando fondo",
},
upscale: {
scaleFactor: "Factor de escala",
quality: "Calidad",
enhanceFaces: "Mejorar rostros",
noiseReduction: "Reduccion de ruido",
noiseReductionHint:
"Suaviza el grano y el ruido. Valores mas altos eliminan mas ruido pero pueden suavizar los detalles.",
outputFormat: "Formato de salida",
submit: "Escalar {scale}x",
submitBatch: "Escalar {scale}x ({count} archivos)",
progressLabel: "Escalando imagen",
progressLabelBatch: "Escalando {count} imagenes",
},
"erase-object": {
brushSize: "Tamano del pincel",
fine: "Fino",
wide: "Ancho",
undo: "Deshacer",
clear: "Limpiar",
outputFormat: "Formato de salida",
quality: "Calidad",
paintHint: "Pinta sobre los objetos que quieras eliminar. Usa Ctrl+Z para deshacer.",
submit: "Borrar objeto",
submitBatch: "Borrar todos ({count})",
progressLabel: "Borrando objeto",
},
ocr: {
quality: "Calidad",
enhanceBeforeScanning: "Mejorar antes de escanear",
enhanceHint:
"Endereza, mejora el contraste, elimina el ruido y escala la imagen automaticamente antes del escaneo para mayor precision.",
language: "Idioma",
autoDetect: "Deteccion automatica",
extractedText: "Texto extraido",
noTextDetected: "No se detecto texto en esta imagen",
characters: "{count} caracteres",
submit: "Extraer texto",
submitBatch: "Extraer texto ({count} archivos)",
progressLabel: "Extrayendo texto",
},
"blur-faces": {
blurRadius: "Radio de desenfoque",
blurLight: "Ligero",
blurHeavy: "Fuerte",
detectionSensitivity: "Sensibilidad de deteccion",
moreFaces: "Mas rostros",
fewerFaces: "Menos rostros",
submit: "Desenfocar rostros",
progressLabel: "Desenfocando rostros",
},
"enhance-faces": {
quality: "Calidad",
enhancementStrength: "Intensidad de mejora",
onlyCenterFace: "Solo el rostro central",
detectionSensitivity: "Sensibilidad de deteccion",
submit: "Mejorar rostros",
submitBatch: "Mejorar rostros ({count} archivos)",
progressLabel: "Mejorando rostros",
},
"smart-crop": {
subjectFocus: "Enfoque en sujeto",
faceFocus: "Enfoque en rostro",
autoTrim: "Recorte automatico",
customSize: "Tamano personalizado",
socialPresets: "Presets de redes sociales",
detectionStrategy: "Estrategia de deteccion",
detectionStrategyHint:
"Atencion encuentra la region visualmente mas relevante. Entropia encuentra el area con mas detalle e informacion.",
attention: "Atencion",
entropy: "Entropia",
padding: "Relleno",
paddingHint: "Espacio extra alrededor del area de enfoque",
outputQuality: "Calidad de salida",
outputQualityHint: "Para salidas JPEG y WebP. PNG siempre es sin perdida.",
subjectDescription:
"Detecta la region mas interesante usando analisis de relevancia y recorta al tamano deseado.",
framing: "Encuadre",
facePadding: "Espacio alrededor del rostro",
facePaddingHint: "Espacio extra alrededor de los rostros detectados",
fewerFalsePositives: "Menos falsos positivos",
faceDescription:
"Usa deteccion facial con AI para mantener los rostros bien encuadrados. Si no se detectan rostros, usa el enfoque en sujeto.",
trimTolerance: "Tolerancia",
trimDescription:
"Que tan diferente puede ser un pixel del borde respecto al color del borde y aun asi ser recortado. Mayor = mas agresivo.",
padToSquare: "Rellenar a cuadrado",
targetSizePx: "Tamano objetivo (px)",
padColor: "Color de relleno",
trimHint:
'Elimina bordes de color uniforme alrededor del sujeto. Activa "Rellenar a cuadrado" para imagenes listas para e-commerce.',
submitSubject: "Recorte inteligente",
submitFace: "Recorte facial",
submitTrim: "Recortar bordes",
},
imageEnhancement: {
enhancementMode: "Modo de mejora",
auto: "Automatico",
portrait: "Retrato",
landscape: "Paisaje",
lowLight: "Poca luz",
food: "Comida",
document: "Documento",
intensity: "Intensidad",
deepEnhance: "Mejora profunda (AI)",
deepEnhanceDescription: "Elimina ruido y artefactos usando AI",
deepEnhanceRequires: "Requiere el paquete de Escalado y mejora",
analyzingImage: "Analizando imagen...",
detectedIssues: "Problemas detectados",
imageLooksGood: "La imagen se ve bien. Ajusta con el control de intensidad.",
issueUnderexposed: "Baja exposicion",
issueOverexposed: "Sobreexpuesta",
issueLowContrast: "Contraste plano",
issueColorCast: "Dominante de color",
issueDesaturated: "Desaturada",
issueSoftFocus: "Enfoque suave",
issueNoisy: "Ruidosa",
submit: "Mejorar",
submitDeep: "Mejora profunda",
submitBatch: "Mejorar ({count} archivos)",
submitDeepBatch: "Mejora profunda ({count} archivos)",
progressLabel: "Mejorando imagen",
progressLabelBatch: "Mejorando {count} imagenes",
},
"noise-removal": {
denoisingTier: "Nivel de eliminacion de ruido",
quick: "Rapido",
balanced: "Equilibrado",
quality: "Calidad",
maximum: "Maximo",
quickDesc: "Rapido y ligero",
balancedDesc: "Buena calidad, velocidad moderada",
qualityDesc: "Con AI, lento",
maximumDesc: "Mejor modelo AI, mas lento",
strength: "Intensidad",
subtle: "Sutil",
aggressive: "Agresivo",
detailPreservation: "Preservacion de detalles",
smooth: "Suave",
sharp: "Nitido",
colorNoise: "Ruido de color",
heavy: "Intenso",
outputFormat: "Formato de salida",
gifAiWarning:
"La eliminacion de ruido con AI en archivos GIF procesa solo el primer fotograma. Para GIFs animados, usa el nivel Rapido o Equilibrado.",
submit: "Eliminar ruido",
submitBatch: "Eliminar ruido ({count} archivos)",
progressLabel: "Eliminando ruido",
progressLabelBatch: "Eliminando ruido de {count} imagenes",
},
"red-eye-removal": {
sensitivity: "Sensibilidad",
strict: "Estricta",
aggressive: "Agresiva",
correctionStrength: "Intensidad de correccion",
subtle: "Sutil",
dark: "Oscuro",
outputFormat: "Formato de salida",
quality: "Calidad",
submit: "Corregir ojos rojos",
submitBatch: "Corregir ojos rojos ({count} archivos)",
progressLabel: "Corrigiendo ojos rojos",
progressLabelBatch: "Corrigiendo ojos rojos en {count} imagenes",
},
"restore-photo": {
scratchRemoval: "Eliminacion de rasguños",
scratchRemovalDesc: "Detecta y repara rasguños, roturas y manchas",
faceEnhancement: "Mejora de rostros",
faceEnhancementDesc: "Restaura rostros degradados con CodeFormer AI",
faceFidelity: "Fidelidad del rostro",
enhanced: "Mejorado",
faithful: "Fiel",
noiseReduction: "Reduccion de ruido",
noiseReductionDesc: "Elimina grano y ruido de fotos antiguas",
denoiseStrength: "Intensidad del eliminador de ruido",
autoColorize: "Colorizar automaticamente",
autoColorizeDesc: "Agrega color a fotos en B&N usando DDColor AI",
colorizeStrength: "Intensidad de colorizacion",
vivid: "Vivido",
submit: "Restaurar foto",
submitBatch: "Restaurar fotos ({count})",
progressLabel: "Restaurando foto",
progressLabelBatch: "Restaurando {count} fotos",
},
"content-aware-resize": {
widthPx: "Ancho (px)",
heightPx: "Alto (px)",
resizeToSquare: "Redimensionar a cuadrado",
protectFaces: "Proteger rostros",
protectFacesHint:
"Detecta y protege las areas de rostros de la eliminacion de costuras usando deteccion facial",
smoothing: "Suavizado",
edgeSensitivity: "Sensibilidad de bordes",
submit: "Redimensionar",
submitBatch: "Redimensionar ({count} archivos)",
progressLabel: "Redimensionando con reconocimiento de contenido",
},
"ai-canvas-expand": {
quality: "Calidad",
fast: "Rapido",
balanced: "Equilibrado",
highQuality: "Alta calidad",
fastDesc: "Vista previa rapida, menos pasadas de AI",
balancedDesc: "Buena calidad, velocidad moderada",
highQualityDesc: "Mejores resultados, mas lento",
extendToAspectRatio: "Extender a relacion de aspecto",
extendByPixels: "Extender por (pixeles)",
top: "Arriba",
right: "Derecha",
bottom: "Abajo",
left: "Izquierda",
newSize: "Nuevo tamano: {width} x {height}",
submit: "Extender lienzo",
submitBatch: "Extender ({count} archivos)",
progressLabel: "Extendiendo lienzo",
},
colorize: {
aiModel: "Modelo AI",
fast: "Rapido",
fastDesc: "Resultados rapidos",
balanced: "Equilibrado",
balancedDesc: "El mejor disponible",
best: "Mejor",
bestDesc: "La mas alta calidad",
colorIntensity: "Intensidad de color",
grayscaleLabel: "Escala de grises",
subtleLabel: "Sutil",
naturalLabel: "Natural",
vividLabel: "Vivido",
intensityHint: "Valores mas bajos producen colores mas apagados, estilo vintage.",
strength: "Intensidad de colorizacion",
submit: "Colorizar",
submitBatch: "Colorizar ({count} archivos)",
progressLabel: "Colorizando",
progressLabelBatch: "Colorizando {count} imagenes",
},
"passport-photo": {
country: "Pais",
searchCountries: "Buscar paises...",
noCountriesFound: "No se encontraron paises",
customDimensions: "Dimensiones personalizadas",
documentType: "Tipo de documento",
dimensionsMm: "Dimensiones (mm)",
dpi: "DPI",
pixelsPerInch: "pixeles por pulgada",
backgroundColor: "Color de fondo",
maxFileSize: "Tamano maximo de archivo",
noLimit: "Sin limite",
customKb: "Personalizado KB...",
uploadPortrait: "Sube una foto tipo retrato",
uploadHint:
"Arrastra o sube una imagen en el panel izquierdo para previsualizar tu foto de pasaporte",
analyzingPhoto: "Analizando foto",
detectingLandmarks: "Detectando puntos faciales y eliminando fondo...",
generatePassportPhoto: "Generar foto de pasaporte",
generating: "Generando...",
downloadPhoto: "Descargar foto",
faceCentered: "Rostro centrado",
headLevel: "Cabeza nivelada",
lookingStraight: "Mirando al frente",
faceSize: "Tamano del rostro",
whatYouSee: "Lo que ves es lo que descargas",
dragToAdjust: "Arrastra para ajustar",
scrollToZoom: "Desplaza para hacer zoom",
photoGenerated: "Foto generada. Descargala desde el panel izquierdo.",
},
"transparency-fixer": {
description: "Sube un PNG con fondo transparente falso y lo corregimos en un clic.",
removeWatermark: "Eliminar marca de agua",
removeWatermarkHelp: "Detecta y elimina marcas de agua semitransparentes",
requiresEraser: "Requiere el paquete de Borrador de objetos",
advanced: "Avanzado",
defringe: "Eliminar bordes",
outputFormat: "Formato de salida",
submit: "Corregir transparencia",
submitBatch: "Corregir transparencia ({count} archivos)",
progressLabel: "Corrigiendo transparencia",
},
"watermark-text": {
watermarkText: "Texto de marca de agua",
fontSize: "Tamano de fuente",
color: "Color",
opacity: "Opacidad",
position: "Posicion",
rotation: "Rotacion",
center: "Centro",
topLeft: "Arriba izquierda",
topRight: "Arriba derecha",
bottomLeft: "Abajo izquierda",
bottomRight: "Abajo derecha",
tiled: "Mosaico",
submit: "Agregar marca de agua",
submitBatch: "Agregar marca de agua ({count} archivos)",
progressLabel: "Agregando marca de agua",
},
"watermark-image": {
uploadWatermark: "Subir imagen de marca de agua",
position: "Posicion",
opacity: "Opacidad",
scale: "Escala",
submit: "Aplicar marca de agua",
submitBatch: "Aplicar marca de agua ({count} archivos)",
},
"text-overlay": {
text: "Texto",
fontSize: "Tamano de fuente",
color: "Color",
position: "Posicion",
top: "Arriba",
center: "Centro",
bottom: "Abajo",
backgroundBox: "Caja de fondo",
backgroundColor: "Color de fondo",
shadow: "Sombra",
submit: "Agregar texto",
submitBatch: "Agregar texto ({count} archivos)",
progressLabel: "Agregando texto superpuesto",
},
compose: {
uploadOverlay: "Subir imagen de superposicion",
xPosition: "Posicion X",
yPosition: "Posicion Y",
opacity: "Opacidad",
blendMode: "Modo de mezcla",
submit: "Componer",
},
"meme-generator": {
selectTemplate:
"Selecciona una plantilla de la galeria o sube tu propia imagen para comenzar.",
chooseLayout: "Elige un diseno de texto para tu imagen personalizada.",
textContent: "Contenido del texto",
textStyle: "Estilo del texto",
font: "Fuente",
fontSize: "Tamano de fuente",
textColor: "Color del texto",
strokeColor: "Color del borde",
allCaps: "MAYUSCULAS",
generate: "Generar Meme",
generating: "Generando...",
downloadMeme: "Descargar Meme",
backToGallery: "Volver a la galeria",
},
info: {
loadingInfo: "Cargando informacion...",
filename: "Nombre de archivo",
fileSize: "Tamano de archivo",
dimensions: "Dimensiones",
format: "Formato",
channels: "Canales",
colorSpace: "Espacio de color",
density: "Densidad",
bitDepth: "Profundidad de bits",
progressive: "Progresivo",
pages: "Paginas",
hasAlpha: "Tiene alfa",
hasProfile: "Tiene perfil",
hasExif: "Tiene EXIF",
hasIcc: "Tiene ICC",
hasXmp: "Tiene XMP",
},
compare: {
uploadSecondImage: "Subir segunda imagen",
similarity: "Similitud: {percent}%",
submit: "Comparar",
downloadDiff: "Descargar diferencia",
},
"find-duplicates": {
preset: "Preset",
exact: "Exacto",
similar: "Similar",
loose: "Amplio",
exactDesc: "Copias identicas pixel por pixel, misma imagen en diferentes formatos.",
similarDesc: "Copias redimensionadas, recomprimidas o con ediciones leves.",
looseDesc: "Imagenes visualmente relacionadas, recortes leves, diferentes exposiciones.",
threshold: "Umbral",
submit: "Buscar duplicados",
scanning: "Escaneando...",
},
"color-palette": {
submit: "Extraer paleta",
extracting: "Extrayendo...",
dominantColors: "Colores dominantes",
clickToCopy: "Clic para copiar",
},
"qr-generate": {
contentType: "Tipo de contenido",
url: "URL",
text: "Texto",
wifi: "WiFi",
vcard: "vCard",
email: "Email",
phone: "Telefono",
sms: "SMS",
styling: "Estilo",
dotStyle: "Estilo de puntos",
cornerSquareStyle: "Estilo de esquina cuadrada",
cornerDotStyle: "Estilo de punto de esquina",
foregroundColor: "Color de primer plano",
bgColor: "Color de fondo",
logo: "Logo",
downloadFormat: "Formato de descarga",
submit: "Generar codigo QR",
download: "Descargar codigo QR",
},
"barcode-read": {
submit: "Escanear codigos de barras",
submitBatch: "Escanear ({count} archivos)",
scanning: "Escaneando...",
noBarcodesFound: "No se encontraron codigos de barras",
barcodesFound: "{count} codigo de barras encontrado",
barcodesFoundPlural: "{count} codigos de barras encontrados",
},
collage: {
template: "Plantilla",
aspectRatio: "Relacion de aspecto",
gap: "Espacio",
cornerRadius: "Radio de esquina",
backgroundColor: "Color de fondo",
outputFormat: "Formato de salida",
quality: "Calidad",
submit: "Crear collage",
downloadCollage: "Descargar collage",
},
stitch: {
direction: "Direccion",
horizontal: "Horizontal",
vertical: "Vertical",
grid: "Cuadricula",
gridColumns: "Columnas de cuadricula",
resizeMode: "Modo de redimension",
fit: "Ajustar",
original: "Original",
stretchMode: "Estirar",
cropMode: "Recortar",
alignment: "Alineacion",
start: "Inicio",
center: "Centro",
end: "Fin",
gap: "Espacio",
border: "Borde",
cornerRadius: "Radio de esquina",
backgroundColor: "Color de fondo",
outputFormat: "Formato de salida",
quality: "Calidad",
submit: "Unir imagenes",
},
split: {
modeGrid: "Cuadricula",
modeTileSize: "Tamano de mosaico",
presets: "Presets",
columns: "Columnas",
rows: "Filas",
tileWidth: "Ancho del mosaico",
tileHeight: "Alto del mosaico",
outputFormat: "Formato de salida",
quality: "Calidad",
submit: "Dividir imagen",
downloadAll: "Descargar todo (ZIP)",
},
border: {
presets: "Presets",
borderWidth: "Ancho del borde",
borderColor: "Color del borde",
padding: "Relleno",
paddingColor: "Color del relleno",
cornerRadius: "Radio de esquina",
shadow: "Sombra",
shadowBlur: "Desenfoque de sombra",
shadowOffsetX: "Desplazamiento X de sombra",
shadowOffsetY: "Desplazamiento Y de sombra",
shadowColor: "Color de sombra",
shadowOpacity: "Opacidad de sombra",
submit: "Agregar borde",
submitBatch: "Agregar borde ({count} archivos)",
progressLabel: "Agregando borde",
},
beautify: {
preset: "Preset",
backgroundType: "Tipo de fondo",
solidColor: "Color solido",
linearGradient: "Degradado lineal",
radialGradient: "Degradado radial",
customImage: "Imagen personalizada",
gradientAngle: "Angulo del degradado",
padding: "Relleno",
borderRadius: "Radio de borde",
shadowPreset: "Preset de sombra",
deviceFrame: "Marco de dispositivo",
submit: "Embellecer",
submitBatch: "Embellecer ({count} archivos)",
progressLabel: "Embelleciendo captura de pantalla",
},
"svg-to-raster": {
outputFormat: "Formato de salida",
sizing: "Dimensionado",
scaleMode: "Escala",
customMode: "Personalizado",
scalePresets: "Presets de escala",
dpiPresets: "Presets de DPI",
customWidth: "Ancho (px)",
customHeight: "Alto (px)",
background: "Fondo",
bgTransparent: "Transparente",
bgColor: "Color",
quality: "Calidad",
submit: "Convertir SVG",
submitBatch: "Convertir ({count} archivos)",
progressLabel: "Convirtiendo SVG",
},
vectorize: {
preset: "Preset",
logo: "Logo",
illustration: "Ilustracion",
photo: "Foto",
sketch: "Boceto",
customPreset: "Personalizado",
colorMode: "Modo de color",
bw: "B&N",
colorModeColor: "Color",
threshold: "Umbral",
colorPrecision: "Precision de color",
layerDifference: "Diferencia de capas",
filterSpeckle: "Filtrar manchas",
pathMode: "Modo de trazo",
cornerThreshold: "Umbral de esquina",
invertColors: "Invertir colores",
submit: "Vectorizar",
submitBatch: "Vectorizar ({count} archivos)",
progressLabel: "Vectorizando",
},
"gif-tools": {
mode: "Modo",
resize: "Redimensionar",
optimize: "Optimizar",
speed: "Velocidad",
reverse: "Invertir",
extract: "Extraer",
rotateMode: "Rotar",
pixel: "Pixel",
percentage: "Porcentaje",
colors: "Colores",
dither: "Difuminado",
effort: "Esfuerzo",
speedFactor: "Factor de velocidad",
loopControl: "Control de bucle",
infinite: "Infinito",
once: "Una vez",
customLoop: "Personalizado",
loopCount: "Cantidad de bucles",
extractSingle: "Individual",
extractRange: "Rango",
extractAll: "Todos",
frameNumber: "Numero de fotograma",
frameStart: "Fotograma inicial",
frameEnd: "Fotograma final",
extractFormat: "Formato",
submit: "Procesar GIF",
submitBatch: "Procesar ({count} archivos)",
progressLabel: "Procesando GIF",
},
"image-to-base64": {
outputFormat: "Formato de salida",
keepOriginal: "Mantener original",
quality: "Calidad",
maxWidth: "Ancho maximo",
maxHeight: "Alto maximo",
submit: "Convertir a Base64",
submitBatch: "Convertir ({count} archivos)",
copyBase64: "Copiar Base64",
copyDataUri: "Copiar Data URI",
copyImgTag: "Copiar etiqueta <img>",
copyCssUrl: "Copiar CSS url()",
},
"enhance-faces-standalone": {
model: "Modelo",
fast: "Rapido",
balanced: "Equilibrado",
best: "Mejor",
},
},
urlImport: {
title: "Importar desde URLs",
placeholder: "Pega URLs de imagenes, una por linea...",
importButton: "Importar URLs",
addButton: "Agregar {count} archivos",
adding: "Agregando...",
retryButton: "Reintentar",
cancelButton: "Cancelar",
readyCount: "{count} listos",
failedStatus: "Error",
},
comparison: {
original: "Original",
processed: "Procesado",
before: "Antes",
after: "Despues",
savings: "Ahorro",
},
toolPage: {
emptyPrompt: "Arrastra o sube una imagen para comenzar",
filesCount: "Archivos ({count})",
addMore: "+ Agregar mas",
clearAll: "Limpiar todo",
acceptDescription: "Solo archivos {exts}",
notFound: "Herramienta no encontrada",
configureAndGenerate: "Configura los ajustes y genera.",
processingFailed: "Error al procesar este archivo",
conversionComplete: "Conversion completada",
cannotPreviewDownload:
"Los archivos {type} no se pueden previsualizar en el navegador. Usa el boton de descarga para guardar tu archivo.",
generatingPreview: "Generando vista previa...",
cannotPreviewWillProcess:
"Los archivos {ext} no se pueden previsualizar en el navegador. La herramienta procesara este archivo normalmente.",
previousImage: "Imagen anterior",
nextImage: "Siguiente imagen",
imageCounter: "{current} / {total}",
settingsLabel: "Configuracion",
downloadAllZip: "Descargar todo (ZIP)",
hideSettings: "Ocultar configuracion",
imageArea: "Area de imagen",
},
homePage: {
generatingPreview: "Generando vista previa...",
loadingPreview: "Cargando vista previa...",
changeFile: "Cambiar archivo",
quickActions: "Acciones rapidas",
allTools: "Todas las herramientas",
},
fullscreenGrid: {
searchPlaceholder: "Buscar herramientas...",
hideDetails: "Ocultar detalles",
showDetails: "Mostrar detalles",
switchToSidebar: "Cambiar a vista de barra lateral",
sidebarButton: "Barra lateral",
noToolsFound: "No se encontraron herramientas",
tryDifferent: "Intenta con un termino de busqueda diferente",
},
editor: {
menu: {
file: {
label: "Archivo",
new: "Nuevo",
open: "Abrir",
save: "Guardar",
exportAs: "Exportar como...",
quickExportPng: "Exportacion rapida como PNG",
close: "Cerrar",
},
edit: {
label: "Editar",
undo: "Deshacer",
redo: "Rehacer",
cut: "Cortar",
copy: "Copiar",
copyMerged: "Copiar combinado",
paste: "Pegar",
pasteInPlace: "Pegar en su lugar",
delete: "Eliminar",
freeTransform: "Transformar libremente",
transform: {
label: "Transformar",
scale: "Escalar",
rotate: "Rotar",
skew: "Sesgar",
flipHorizontal: "Voltear horizontal",
flipVertical: "Voltear vertical",
},
},
image: {
label: "Imagen",
imageSize: "Tamano de imagen...",
canvasSize: "Tamano de lienzo...",
rotation: {
label: "Rotacion de imagen",
cw90: "90 en sentido horario",
ccw90: "90 en sentido antihorario",
r180: "180",
flipHorizontal: "Voltear horizontal",
flipVertical: "Voltear vertical",
},
trim: "Recortar",
adjustments: {
label: "Ajustes",
brightnessContrast: "Brillo/Contraste",
hueSaturation: "Matiz/Saturacion",
colorBalance: "Balance de color",
levels: "Niveles",
curves: "Curvas",
},
},
layer: {
label: "Capa",
newLayer: "Nueva capa",
duplicateLayer: "Duplicar capa",
deleteLayer: "Eliminar capa",
arrange: {
label: "Ordenar",
bringToFront: "Traer al frente",
bringForward: "Traer adelante",
sendBackward: "Enviar atras",
sendToBack: "Enviar al fondo",
},
mergeDown: "Combinar hacia abajo",
flattenImage: "Aplanar imagen",
},
select: {
label: "Seleccionar",
all: "Todo",
deselect: "Deseleccionar",
inverse: "Invertir",
colorRange: "Rango de color...",
},
filter: {
label: "Filtro",
blur: {
label: "Desenfoque",
gaussian: "Desenfoque gaussiano",
motion: "Desenfoque de movimiento",
radial: "Desenfoque radial",
surface: "Desenfoque de superficie",
},
sharpen: {
label: "Enfocar",
sharpen: "Enfocar",
unsharpMask: "Mascara de desenfoque",
},
noise: {
label: "Ruido",
addNoise: "Agregar ruido",
reduceNoise: "Reducir ruido",
},
pixelate: {
label: "Pixelar",
pixelate: "Pixelar",
mosaic: "Mosaico",
},
stylize: {
label: "Estilizar",
emboss: "Relieve",
solarize: "Solarizar",
posterize: "Posterizar",
},
grayscale: "Escala de grises",
sepia: "Sepia",
invert: "Invertir",
},
view: {
label: "Ver",
zoomIn: "Acercar",
zoomOut: "Alejar",
fitOnScreen: "Ajustar a pantalla",
actualPixels: "Pixeles reales",
rulers: "Reglas",
grid: "Cuadricula",
guides: "Guias",
snap: "Ajustar",
panels: "Paneles",
},
},
menuBar: {
backTitle: "Volver a SnapOtter",
},
welcome: {
ariaLabel: "Zona de carga de imagenes",
heading: "Editor de imagenes",
dropDescription: "Arrastra una imagen aqui para comenzar",
openImageButton: "Abrir imagen",
newDocumentButton: "Nuevo documento",
pasteHint: "O pega desde el portapapeles (Ctrl+V)",
},
mobile: {
heading: "Se recomienda escritorio",
description:
"El editor de imagenes funciona mejor en pantallas de escritorio. Cambia a un dispositivo con una pantalla mas grande para la experiencia de edicion completa.",
},
errors: {
serverDecodeFailed: "Error de decodificacion del servidor",
},
},
settings: {
heading: "Configuracion",
nav: {
general: "General",
systemSettings: "Configuracion del sistema",
security: "Seguridad",
people: "Personas",
teams: "Equipos",
roles: "Roles",
auditLog: "Registro de auditoria",
apiKeys: "Claves API",
aiFeatures: "Funciones de AI",
tools: "Herramientas",
productAnalytics: "Analitica del producto",
about: "Acerca de",
},
general: {
heading: "General",
description: "Preferencias del usuario y configuracion de pantalla.",
loading: "Cargando...",
logOut: "Cerrar sesion",
defaultToolViewLabel: "Vista predeterminada de herramientas",
defaultToolViewDescription: "Como se muestran las herramientas en la pagina de inicio",
sidebarOption: "Barra lateral",
fullscreenGridOption: "Cuadricula de pantalla completa",
appVersionLabel: "Version de la app",
appVersionDescription: "Version actual de SnapOtter",
saveButton: "Guardar configuracion",
saveSuccess: "Configuracion guardada.",
saveFailed: "Error al guardar la configuracion.",
},
system: {
heading: "Configuracion del sistema",
description: "Configuracion del servidor y limites.",
fileUploadLimitLabel: "Limite de carga de archivos (MB)",
fileUploadLimitDescription: "Tamano maximo de archivo por carga",
defaultThemeLabel: "Tema predeterminado",
defaultThemeDescription: "Tema aplicado para nuevas sesiones",
lightOption: "Claro",
darkOption: "Oscuro",
systemOption: "Sistema",
languageLabel: "Idioma",
languageDescription: "Idioma de la interfaz",
loginAttemptLimitLabel: "Limite de intentos de inicio de sesion",
loginAttemptLimitDescription:
"Intentos fallidos maximos de inicio de sesion por minuto antes del bloqueo",
fileManagementHeading: "Gestion de archivos",
maxFileAgeLabel: "Edad maxima de archivos (horas)",
maxFileAgeDescription:
"Cuanto tiempo se conservan los archivos procesados antes de la limpieza automatica",
startupCleanupLabel: "Limpieza al inicio",
startupCleanupDescription: "Limpia archivos temporales antiguos cuando el servidor arranca",
saveButton: "Guardar configuracion",
saveSuccess: "Configuracion guardada.",
saveFailed: "Error al guardar la configuracion.",
limitsAndResources: "Limites y recursos",
maxFileSize: "Tamano maximo de archivo",
maxBatchSize: "Tamano maximo de lote",
concurrentJobs: "Trabajos simultaneos",
workerThreads: "Hilos de trabajo",
maxPipelineSteps: "Pasos maximos de Pipeline",
processingTimeout: "Tiempo de espera de procesamiento",
rateLimitPerMin: "Limite de solicitudes (req/min)",
unlimited: "Ilimitado",
auto: "Automatico",
envOverride: "Establecido por variable de entorno",
maxCanvasPixels: "Pixeles maximos de lienzo",
maxSvgSize: "Tamano maximo de SVG",
maxSplitGrid: "Cuadricula maxima de division",
maxPdfPages: "Paginas maximas de PDF",
sessionDuration: "Duracion de la sesion",
},
security: {
heading: "Seguridad",
description: "Configuracion de contrasena y autenticacion.",
changePasswordHeading: "Cambiar contrasena",
currentPasswordPlaceholder: "Contrasena actual",
newPasswordPlaceholder: "Nueva contrasena",
confirmPasswordPlaceholder: "Confirmar nueva contrasena",
passwordsMismatch: "Las contrasenas no coinciden",
passwordTooShort: "La contrasena debe tener al menos 4 caracteres",
changeSuccess: "Contrasena cambiada correctamente",
changeFailed: "Error al cambiar la contrasena",
currentPasswordIncorrect: "La contrasena actual es incorrecta",
changePasswordButton: "Cambiar contrasena",
loginAttemptLimitNote:
"Los limites de intentos de inicio de sesion se pueden configurar en Configuracion del sistema.",
},
people: {
heading: "Personas",
description: "Administra los miembros del espacio de trabajo y sus permisos",
userCount: "{count} usuario",
userCountPlural: "{count} usuarios",
searchPlaceholder: "Buscar miembros...",
addMembersButton: "Agregar miembros",
newMemberHeading: "Nuevo miembro",
usernamePlaceholder: "Nombre de usuario",
passwordPlaceholder: "Contrasena",
roleUserOption: "Usuario",
roleEditorOption: "Editor",
roleAdminOption: "Admin",
roleUserDescription: "Acceso basico a herramientas",
roleEditorDescription: "Todos los archivos y pipelines",
roleAdminDescription: "Acceso completo",
noDescription: "Sin descripcion",
defaultTeamOption: "Predeterminado",
createButton: "Crear",
cancelButton: "Cancelar",
createSuccess: "Usuario creado correctamente",
createFailed: "Error al crear el usuario",
userLimitReached: "Limite de usuarios alcanzado ({max} maximo)",
deleteConfirm: 'Eliminar usuario "{username}"? Esta accion no se puede deshacer.',
deleteSuccess: 'Usuario "{username}" eliminado',
deleteFailed: "Error al eliminar el usuario",
editHeading: "Editar {username}",
updateSuccess: "Usuario actualizado",
updateFailed: "Error al actualizar el usuario",
cannotRemoveOwnAdmin: "No puedes eliminar tu propio rol de administrador",
resetPasswordHeading: "Restablecer contrasena para {username}",
newPasswordLabel: "Nueva contrasena (minimo 8 caracteres)",
resetPasswordButton: "Restablecer contrasena",
resetPasswordWarning: "Esto invalidara todas las sesiones y claves API de este usuario.",
resetSuccess: "Contrasena restablecida correctamente",
resetFailed: "Error al restablecer la contrasena",
tableHeaderUser: "Usuario",
tableHeaderRole: "Rol",
tableHeaderTeam: "Equipo",
noSearchResults: "Ningun miembro coincide con tu busqueda.",
noUsersFound: "No se encontraron usuarios.",
authBadgeLocalOidc: "Local + OIDC",
authBadgeOidc: "OIDC",
editRoleTeamAction: "Editar rol / equipo",
resetPasswordAction: "Restablecer contrasena",
deleteUserAction: "Eliminar usuario",
saveButton: "Guardar",
},
teams: {
heading: "Equipos",
description: "Organiza a los miembros en equipos para una mejor gestion.",
createButton: "Crear nuevo equipo",
newTeamHeading: "Nuevo equipo",
teamNamePlaceholder: "Nombre del equipo",
createSubmitButton: "Crear",
cancelButton: "Cancelar",
createSuccess: "Equipo creado correctamente",
createFailed: "Error al crear el equipo",
duplicateTeamError: "Ya existe un equipo con ese nombre",
renameSuccess: "Equipo renombrado",
renameFailed: "Error al renombrar el equipo",
deleteConfirm: 'Eliminar equipo "{name}"? Los miembros seran desasignados.',
deleteSuccess: 'Equipo "{name}" eliminado',
deleteFailed: "Error al eliminar el equipo",
cannotDeleteDefault: "No se puede eliminar el equipo predeterminado o un equipo con miembros",
tableHeaderTeamName: "Nombre del equipo",
tableHeaderMembers: "Miembros",
emptyState: "No se encontraron equipos.",
renameSaveButton: "Guardar",
renameCancelButton: "Cancelar",
renameAction: "Renombrar",
deleteAction: "Eliminar",
totalMembers: "Total de miembros",
nameRequired: "El nombre del equipo es obligatorio",
nameTooLong: "El nombre del equipo debe tener 50 caracteres o menos",
duplicateName: "Ya existe un equipo con este nombre",
},
roles: {
heading: "Roles",
description:
"Administra roles y sus permisos. Los roles predeterminados no se pueden modificar.",
createButton: "Crear rol personalizado",
newRoleHeading: "Nuevo rol",
roleNamePlaceholder: "Nombre del rol",
descriptionPlaceholder: "Descripcion (opcional)",
permissionsLabel: "Permisos",
createSubmitButton: "Crear",
cancelButton: "Cancelar",
createSuccess: "Rol creado correctamente",
createFailed: "Error al crear el rol",
duplicateRoleError: "Ya existe un rol con ese nombre",
editHeading: "Editar rol: {name}",
editSaveButton: "Guardar",
editCancelButton: "Cancelar",
updateSuccess: "Rol actualizado",
updateFailed: "Error al actualizar el rol",
deleteConfirm: 'Eliminar rol "{name}"? {count} usuario(s) deberan ser reasignados.',
deleteConfirmSimple: 'Eliminar rol "{name}"?',
deleteSuccess: 'Rol "{name}" eliminado',
deleteFailed: "Error al eliminar el rol",
emptyState: "No se encontraron roles.",
builtInBadge: "Predeterminado",
userCountBadge: "{count} usuario(s)",
editRoleTitle: "Editar rol",
deleteRoleTitle: "Eliminar rol",
permGroup: {
tools: "Herramientas",
files: "Archivos",
apiKeys: "Claves API",
pipelines: "Pipelines",
settings: "Configuracion",
users: "Usuarios",
teams: "Equipos",
system: "Sistema",
},
},
auditLog: {
heading: "Registro de auditoria",
allActionsFilter: "Todas las acciones",
emptyState: "No hay entradas en el registro de auditoria.",
tableHeaderTime: "Hora",
tableHeaderUser: "Usuario",
tableHeaderAction: "Accion",
tableHeaderTarget: "Objetivo",
paginationInfo: "Pagina {page} de {totalPages} ({total} entradas)",
previousButton: "Anterior",
nextButton: "Siguiente",
justNow: "ahora mismo",
minutesAgo: "hace {mins}m",
hoursAgo: "hace {hrs}h",
daysAgo: "hace {days}d",
},
apiKeys: {
heading: "Claves API",
description: "Administra las claves API para acceso programatico a SnapOtter.",
keyNamePlaceholder: "Nombre de la clave (opcional)",
generateButton: "Generar clave API",
removeScopingLabel: "Eliminar restriccion de permisos",
restrictPermissionsLabel: "Restringir permisos (opcional)",
expiresLabel: "Expira:",
clearButton: "Limpiar",
copyTitle: "Copiar",
keyWarning: "Guarda esta clave de forma segura. No se mostrara de nuevo.",
existingKeysHeading: "Claves existentes",
createdPrefix: "Creada {date}",
scopedPrefix: "Alcance:",
expiresPrefix: "Expira {date}",
deleteKeyTitle: "Eliminar clave",
deleteConfirm: "Eliminar esta clave API? Las integraciones que la usen dejaran de funcionar.",
emptyState: "Aun no hay claves API. Genera una para comenzar.",
},
tools: {
heading: "Herramientas",
description:
"Activa o desactiva herramientas individuales. Las herramientas desactivadas se ocultan para todos los usuarios.",
restartBanner: "Se requiere reinicio para que los cambios surtan efecto.",
searchPlaceholder: "Buscar herramientas...",
noSearchResults: "Ninguna herramienta coincide con tu busqueda.",
loadFailedError:
"Error al cargar la configuracion de herramientas. El guardado esta desactivado para prevenir perdida de datos.",
saveButton: "Guardar configuracion de herramientas",
disabledCount: "{count} herramienta(s) desactivada(s)",
},
experimental: {
label: "Activar herramientas experimentales",
description: "Muestra herramientas que aun estan en desarrollo. Pueden ser inestables.",
},
fileManagement: {
title: "Gestion de archivos",
maxAge: "Edad maxima de archivos (horas)",
maxAgeDescription:
"Cuanto tiempo se conservan los archivos procesados antes de la limpieza automatica",
startupCleanup: "Limpieza al inicio",
startupCleanupDescription: "Limpia archivos temporales antiguos cuando el servidor arranca",
},
analytics: {
heading: "Analitica del producto",
description: "Comparte datos de uso anonimos para ayudar a mejorar SnapOtter.",
privacyNote: "Tus imagenes nunca salen de tu equipo.",
disabledByAdmin:
"La analitica del producto ha sido desactivada por el administrador del servidor.",
enabledLabel: "Analitica activada",
disabledLabel: "Analitica desactivada",
learnMore: "Mas informacion",
},
aiFeatures: {
title: "AI Features",
description: "Manage AI model bundles for advanced image processing.",
installAll: "Install All",
diskUsage: "Disk usage:",
installed: "Installed",
notInstalled: "Not installed",
queued: "Queued",
install: "Install",
repair: "Repair",
uninstall: "Uninstall",
installing: "Installing...",
},
about: {
heading: "Acerca de",
appName: "SnapOtter",
appDescription:
"Una suite de procesamiento de imagenes autoalojada y con privacidad como prioridad, con 51 herramientas. Redimensiona, comprime, convierte, agrega marcas de agua y automatiza tus flujos de trabajo de imagenes sin enviar datos a la nube.",
versionLabel: "Version:",
linksHeading: "Enlaces",
githubLink: "Repositorio en GitHub",
docsLink: "Documentacion",
apiRefLink: "Referencia API (Swagger)",
},
},
auth: {
login: "Iniciar sesion",
logout: "Cerrar sesion",
username: "Nombre de usuario",
password: "Contrasena",
loginButton: "Iniciar sesion",
loggingIn: "Iniciando sesion...",
invalidCredentials: "Nombre de usuario o contrasena invalidos",
connectionError: "Error de conexion",
signInWith: "Iniciar sesion con {provider}",
signInWithSso: "Iniciar sesion con SSO",
or: "o",
methodLocal: "Local",
methodOidc: "OIDC",
methodBoth: "Local + OIDC",
oidcAuthFailed: "La autenticacion fallo. Intenta de nuevo.",
oidcProviderUnreachable: "No se pudo contactar al proveedor de identidad. Intenta mas tarde.",
oidcSessionExpired: "La sesion de inicio de sesion expiro. Intenta de nuevo.",
oidcUserNotAuthorized:
"Tu cuenta no esta autorizada para acceder a esta aplicacion. Contacta a tu administrador.",
oidcUserLimitReached: "Limite de usuarios alcanzado. Contacta a tu administrador.",
oidcGenericError: "Error de autenticacion. Intenta de nuevo.",
passwordManagedByProvider:
"Los cambios de contrasena son administrados por tu proveedor de identidad.",
enterUsername: "Ingresa tu nombre de usuario",
enterPassword: "Ingresa tu contrasena",
heroTitle: "Tus imagenes. Se quedan contigo.",
heroSubtitle: "Todas las herramientas de imagen que necesitas.",
rotatingPhrases: [
"Sin registros. Sin cuentas.",
"Sin subidas a la nube. Nunca.",
"100% procesamiento local.",
"Gratis. Para siempre.",
"Sin limites. Sin topes ocultos.",
"Funciona totalmente sin conexion.",
"Procesamiento por lotes ilimitado.",
"51 herramientas de imagen.",
"15 modelos AI. Tu hardware.",
"Ultra rapido. Construido sobre Sharp.",
"Listo para redes aisladas.",
"Un solo contenedor Docker.",
"Codigo abierto. Siempre.",
"Cada pixel se queda en tu hardware.",
"Tu servidor. Tus reglas.",
"Se instala con un solo docker pull.",
"La alternativa autoalojada.",
"Redimensiona, comprime, convierte. Localmente.",
"Editor de imagenes gratuito. Sin marcas de agua.",
"Procesamiento masivo de imagenes. Ilimitado.",
"Elimina fondos sin conexion.",
"Alternativa autoalojada a Canva.",
"Sin claves API necesarias.",
"Cumplimiento GDPR por diseno.",
"Funciona sin internet.",
],
},
changePassword: {
title: "Cambia tu contrasena",
description:
"Necesitas establecer una nueva contrasena antes de continuar. Tu contrasena debe tener al menos 8 caracteres con mayusculas, minusculas y un numero.",
usernameLabel: "Nombre de usuario",
currentPasswordLabel: "Contrasena actual",
currentPasswordPlaceholder: "Ingresa la contrasena actual",
newPasswordLabel: "Nueva contrasena",
generateButton: "Generar contrasena segura",
newPasswordPlaceholder: "Al menos 8 caracteres",
confirmPasswordLabel: "Confirmar nueva contrasena",
confirmPasswordPlaceholder: "Repite la nueva contrasena",
passwordsMismatch: "Las contrasenas no coinciden",
failedError: "Error al cambiar la contrasena",
connectionError: "Error de conexion",
changingButton: "Cambiando...",
changeButton: "Cambiar contrasena",
sidebarTitle: "Ya casi",
sidebarDescription: "Establece una contrasena segura para proteger tu cuenta y estaras listo.",
},
automate: {
title: "Automatizar",
invalidPipelineFile: "No es un archivo de Pipeline de SnapOtter valido",
newerVersion: "Este Pipeline fue creado con una version mas reciente de SnapOtter",
missingName: "Al archivo de Pipeline le falta un nombre",
noSteps: "El archivo de Pipeline no tiene pasos",
importFailed: "Error en la importacion",
couldNotRead: "No se pudo leer el archivo de Pipeline",
fileCount: "{count} archivo",
fileCountPlural: "{count} archivos",
importFromLibrary: "Importar desde la biblioteca",
addButton: "+ Agregar",
libraryButton: "Biblioteca",
clearButton: "Limpiar",
processingFailed: "Error al procesar este archivo",
processingMultiple: "Procesando {count} archivos...",
processingPipeline: "Procesando Pipeline...",
processButton: "Procesar",
processButtonMultiple: "Procesar ({count})",
processAllButton: "Procesar todo ({count})",
addTool: "Agregar herramienta",
toolPalette: "Paleta de herramientas",
clickToAdd: "Clic para agregar al Pipeline",
savedLabel: "Guardado",
importButton: "Importar",
noSavedPipelines: "No hay Pipelines guardados",
stepCount: "({count} paso)",
stepCountPlural: "({count} pasos)",
exportPipeline: "Exportar Pipeline",
deletePipeline: "Eliminar Pipeline",
moreCount: "+{count} mas",
pipelineBuilder: "Constructor de Pipeline",
addToolsPrompt: "Agrega herramientas desde la paleta para comenzar",
stepsConfigured: "{count} paso configurado",
stepsConfiguredPlural: "{count} pasos configurados",
noFilesLoaded: "No hay archivos cargados",
downloadZip: "Descargar ZIP",
saveButton: "Guardar",
pipelineNamePlaceholder: "Nombre del Pipeline",
descriptionPlaceholder: "Descripcion",
savingIndicator: "...",
cancelButton: "Cancelar",
preview: "Vista previa",
previousImage: "Imagen anterior",
nextImage: "Siguiente imagen",
imageCounter: "{current} / {total}",
imageArea: "Area de imagen",
templateSocialMedia: "Listo para redes sociales",
templatePrivacyClean: "Limpieza de privacidad",
templateWebOptimization: "Optimizacion web",
templateProfilePicture: "Foto de perfil",
templateWatermarkBatch: "Lote de marcas de agua",
createNew: "Crear nueva automatizacion",
savedAutomations: "Automatizaciones guardadas",
templates: "Plantillas",
addStep: "Agregar paso",
removeStep: "Eliminar",
moveUp: "Subir",
moveDown: "Bajar",
savePipeline: "Guardar Pipeline",
runPipeline: "Procesar",
pipelineName: "Nombre del Pipeline",
pipelineDescription: "Descripcion (opcional)",
noStepsPrompt: "Agrega pasos para construir tu automatizacion",
step: "Paso",
},
nav: {
tools: "Herramientas",
reader: "Lector",
automate: "Automatizar",
editor: "Editor",
files: "Archivos",
help: "Ayuda",
settings: "Configuracion",
grid: "Cuadricula",
},
files: {
recentTab: "Recientes",
uploadTab: "Subir",
fileDetailsAriaLabel: "Detalles del archivo",
fileDetailsHeading: "Detalles del archivo",
},
dropzone: {
unsupportedFileType: "Este tipo de archivo no es compatible con esta herramienta",
urlFetchFailed: "No se pudo obtener la imagen desde la URL",
ariaLabel: "Zona de carga de archivos",
dropPrompt: "Arrastra tus imagenes aqui",
browseOrPaste: "haz clic en cualquier lugar para explorar, o pega desde el portapapeles",
uploadButton: "Subir",
defaultFormats: "PNG, JPG, WebP, HEIC, RAW, PSD y mas de 65 formatos",
orSeparator: "o",
urlPlaceholder: "Pega la URL de la imagen...",
urlLoadingIndicator: "...",
addUrlButton: "Agregar",
importMultipleUrls: "Importar multiples URLs...",
filesSelected: "{count} archivos seleccionados",
},
reviewPanel: {
processedResultAlt: "Resultado procesado",
sizeLabel: "Tamano: {size}",
typeLabel: "Tipo: {type}",
processedLabel: "Procesado: {time}",
undoButton: "Deshacer",
downloadButton: "Descargar",
openInEditor: "Abrir en el editor",
reviewHeading: "Revisar",
continueEditing: "Continuar editando",
},
features: {
notEnabledTitle: "Funcion no activada",
notEnabledDescription:
"Esta funcion no esta activada. Pide a tu administrador que la active en Configuracion.",
requiresDownload: "Esta funcion requiere una descarga adicional (~{size})",
retryButton: "Reintentar",
queued: "En cola para instalacion...",
enableButton: "Activar {name}",
lessThanMinute: "Menos de un minuto restante",
oneMinuteLeft: "~1 minuto restante",
minutesLeft: "~{mins} minutos restantes",
progressMessages: [
"Ya casi... probablemente...",
"Las cosas buenas toman tiempo...",
"Mas rapido que ver secar la pintura...",
"Tu paciencia es verdaderamente inspiradora...",
"Trabajando mas duro de lo que parece...",
"Esta es la parte emocionante, en serio...",
"Haciendo cosas importantes tras bambalinas...",
"Si lees esto, esta funcionando...",
"Preparando algo increible...",
"Vale cada segundo, lo prometo...",
"El suspenso es parte de la experiencia...",
"Ensenandole trucos nuevos a tu computadora...",
"Configurando tus superpoderes...",
"Tus imagenes te lo agradeceran despues...",
"Cargando... pero con estilo...",
"Buen momento para un cafe...",
"Roma tampoco se construyo en un dia...",
"Shhh... genio trabajando...",
"Haciendo que tus fotos se pongan celosas...",
"Armando el equipo de ensueño...",
"Desempacando cosas geniales...",
"Ya casi termino de pensar en empezar... es broma...",
"Giro de trama: esto de verdad esta haciendo algo...",
"Calentando los motores creativos...",
"Cargando imaginacion...",
"No es un protector de pantalla, lo prometemos...",
"El gran arte necesita tiempo para instalarse...",
"Tu yo del futuro te lo agradecera...",
"Buscando archivos muy inteligentes...",
"Aguanta, lo mejor esta por venir...",
],
},
help: {
heading: "Ayuda",
gettingStarted: {
heading: "Primeros pasos",
description:
"Selecciona una herramienta desde la barra lateral o busca una. Sube una imagen arrastandola a la pagina o haciendo clic en el area de carga. Ajusta la configuracion y descarga tu resultado.",
},
keyboardShortcuts: {
heading: "Atajos de teclado",
focusSearchBar: "Enfocar barra de busqueda",
goToTools: "Ir a herramientas",
toggleTheme: "Cambiar tema",
goToResize: "Ir a Redimensionar",
goToCrop: "Ir a Recortar",
goToCompress: "Ir a Comprimir",
goToConvert: "Ir a Convertir",
goToRemoveBackground: "Ir a Eliminar fondo",
goToWatermarkText: "Ir a Marca de agua de texto",
goToStripMetadata: "Ir a Eliminar metadatos",
goToImageInfo: "Ir a Info de imagen",
},
resources: {
heading: "Recursos",
githubLink: "Repositorio en GitHub",
reportIssueLink: "Reportar un problema",
docsLink: "Documentacion",
apiRefLink: "Referencia API (Swagger)",
},
versionLabel: "SnapOtter v{version}",
},
errors: {
generic: "Ocurrio un error",
offline: "Estas sin conexion",
reconnecting: "Reconectando al servidor...",
connected: "Conectado",
processingFailed: "Error al procesar este archivo",
timeout:
"La solicitud agoto el tiempo de espera. El servidor puede estar sobrecargado. Intenta de nuevo.",
networkError: "Error de red. Verifica tu conexion.",
invalidCredentials: "Nombre de usuario o contrasena invalidos",
connectionError: "Error de conexion",
},
analytics: {
consentTitle: "Ayuda a mejorar SnapOtter",
consentDescription:
"Las estadisticas de uso anonimas nos ayudan a corregir errores y crear las herramientas que realmente necesitas. Tus imagenes y archivos se quedan en tu equipo.",
consentChangeable: "Puedes desactivar esto en cualquier momento en Configuracion.",
acceptButton: "Claro, me parece bien",
declineButton: "Ahora no",
settingsTitle: "Analitica del producto",
settingsDescription: "Comparte datos de uso anonimos para ayudar a mejorar SnapOtter.",
settingsPrivacy: "Tus imagenes nunca salen de tu equipo.",
settingsDisabledByAdmin:
"La analitica del producto ha sido desactivada por el administrador del servidor.",
learnMore: "Mas informacion",
},
sidebar: {
tools: "Herramientas",
grid: "Cuadricula",
automate: "Automatizar",
editor: "Editor",
files: "Archivos",
help: "Ayuda",
settings: "Configuracion",
},
toolCard: {
addToFavourites: "Agregar a favoritos",
},
appLayout: {
mobileNavTools: "Herramientas",
mobileNavAutomate: "Automatizar",
mobileNavEditor: "Editor",
mobileNavFiles: "Archivos",
mobileNavSettings: "Configuracion",
},
} as const;