{
  "common": {
    "home": "Inicio",
    "tools": "Herramientas",
    "blog": "Blog",
    "about": "Acerca de",
    "contact": "Contacto",
    "privacy": "Política de Privacidad",
    "terms": "Términos de Servicio",
    "search": "Buscar herramientas…",
    "footer_text": "Herramientas en línea gratuitas para todos. Sin registro ni instalación.",
    "all_rights_reserved": "Todos los derechos reservados. Hecho con ❤️ para creadores.",
    "sponsor": "Apoyar",
    "support_project": "Apoyar este proyecto",
    "support_description": "Crear herramientas gratuitas requiere tiempo y pasión. ¡Tu apoyo ayuda a mantener vivo este proyecto!",
    "progress": "Progreso",
    "groups": "Grupos",
    "sample": "Muestra",
    "reset_sample": "Restablecer muestra",
    "showing_first_n": "Mostrando las primeras {{count}} coincidencias para mantener la velocidad.",
    "no_capture_groups": "No hay grupos de captura en esta coincidencia.",
    "group": "Grupo",
    "empty": "Vacío",
    "swap_directions": "Intercambiar las direcciones de entrada y salida",
    "upload_error_type": "Tipo de archivo no compatible: {{name}}.",
    "upload_error_size": "{{name}} supera el límite de {{size}} MB."
  },
  "tool_page": {
    "share_tool": "Compartir esta herramienta:",
    "copy_link": "Copiar enlace",
    "link_copied": "¡Copiado!",
    "share_qr": "Compartir QR",
    "generating_qr": "Generando QR…",
    "share_by_scanning": "Escanear para compartir",
    "scan_on_mobile": "Escanear con el móvil o guardar imagen",
    "failed_qr": "Error al generar QR",
    "close": "Cerrar",
    "loading": "Cargando",
    "preparing": "Cargando herramienta… Las bibliotecas grandes de PDF o medios pueden tardar un momento.",
    "coming_soon": "Próximamente",
    "roadmap_message": "Esta herramienta está en la hoja de ruta. Sigue el proyecto o vuelve después del próximo lanzamiento.",
    "why_use": "Por qué usarlo",
    "faq": "Preguntas frecuentes",
    "faq_subtitle": "Respuestas útiles que puedes reutilizar.",
    "tool_details": "Detalles de la herramienta",
    "category": "Categoría",
    "tags": "Etiquetas",
    "referral": "Referencia",
    "recommended": "Recomendado",
    "get_deal": "Obtener oferta",
    "more_tools": "Más herramientas",
    "related_guides": "Guías relacionadas",
    "browse_directory": "Explorar directorio completo"
  },
  "seo": {
    "free_prefix": "Gratis",
    "high_quality_suffix": " (Alta Calidad)",
    "tool_not_found": "Herramienta no encontrada",
    "description_suffix": "Gratis, en el navegador y sin registro.",
    "unavailable_description": "La herramienta solicitada no está disponible dentro de JW Tool Box.",
    "keywords_free_online": "herramientas online gratis",
    "keywords_no_signup": "no se requiere registro",
    "keywords_web": "herramienta web",
    "no_signup_required": "No se requiere cuenta ni registro.",
    "free_online_tool": "{{name}} - herramienta online gratis"
  },
  "faq_content": {
    "is_free_question": "¿Es esta herramienta gratuita?",
    "is_free_answer": "Sí. JW Tool Box es gratis y no requiere cuenta ni registro."
  },
  "image_watermark": {
    "title": "Marca de agua de imagen por lotes (Local)",
    "description": "Añade marcas de agua de texto y exporta ZIP de JPG/PNG en tu navegador sin subir nada—perfecto para fotos, capturas de pantalla o facturas.",
    "drag_drop": "Haz clic o arrastra imágenes (JPG/PNG/WebP)",
    "processed_locally": "Procesado localmente; exportar como ZIP.",
    "watermark_text": "Texto de la marca de agua",
    "sample_watermark": "Marca de agua de ejemplo",
    "position": "Posición",
    "center": "Centro",
    "top_left": "Arriba a la izquierda",
    "top_right": "Arriba a la derecha",
    "bottom_left": "Abajo a la izquierda",
    "bottom_right": "Abajo a la derecha",
    "opacity": "Opacidad",
    "text_size": "Tamaño del texto (% del borde corto)",
    "output_format": "Formato de salida",
    "format_hint": "PNG mantiene la fidelidad; JPG es más pequeño y ajustable.",
    "jpg_quality": "Calidad JPG",
    "download_zip": "Descargar ZIP",
    "processing": "Procesando…",
    "clear_all": "Borrar todo",
    "please_choose_images": "Por favor, elige archivos de imagen.",
    "msg_add_images": "Por favor, añade algunas imágenes primero.",
    "msg_enter_text": "Por favor, introduce el texto de la marca de agua.",
    "msg_processing": "Procesando…",
    "msg_done": "¡Hecho! {{count}} imágenes procesadas.",
    "msg_failed": "Algo salió mal durante el procesamiento."
  },
  "qr_code": {
    "generator_label": "Generador",
    "generator_title": "Convierte cualquier enlace en un código QR fácil de escanear.",
    "error_create": "No se pudo crear un código QR en este momento. Por favor, inténtalo de nuevo.",
    "error_url": "Por favor, introduce una URL válida antes de generar.",
    "error_generate_first": "Genera un código QR antes de descargar.",
    "error_prepare_download": "No se puede preparar el código QR para descargar.",
    "enter_url": "Introduce la URL aquí…",
    "generate_button": "Generar código QR",
    "download_button": "Descargar código QR (PNG)"
  },
  "password_generator": {
    "error_select_charset": "Selecciona al menos un conjunto de caracteres.",
    "error_generate_first": "Genera una contraseña primero.",
    "error_clipboard": "El acceso al portapapeles no está disponible.",
    "length": "Longitud",
    "include_lowercase": "Incluir minúsculas (a-z)",
    "include_uppercase": "Incluir mayúsculas (A-Z)",
    "include_numbers": "Incluir números (0-9)",
    "include_symbols": "Incluir símbolos (!@#$)",
    "avoid_ambiguous": "Evitar ambiguos (I, l, 1, O, 0)",
    "generate_button": "Generar nueva contraseña",
    "copy_button": "Copiar",
    "copied": "¡Copiado!"
  },
  "calculator": {
    "expression": "Expresión",
    "history": "Historial",
    "empty_history": "Aún no hay historial.",
    "shortcuts": "Atajos de teclado: Enter para evaluar, Retroceso para borrar, Esc para limpiar.",
    "error_invalid": "Expresión inválida",
    "mode_scientific": "Científica",
    "mode_standard": "Estándar",
    "switch_to_scientific": "Cambiar a Científica",
    "switch_to_basic": "Cambiar a Básica"
  },
  "home": {
    "hero_title": "Herramientas para desarrolladores gratuitas",
    "hero_subtitle": "Herramientas gratuitas en el navegador, sin cuenta ni registro."
  },
  "blog_page": {
    "all_guides": "Todas las guías",
    "meta_title": "Blog",
    "meta_description": "Guías prácticas y notas de flujo de trabajo relacionadas con las herramientas de JW Tool Box, incluyendo PDF, imágenes, texto y tareas de navegador.",
    "eyebrow": "Blog",
    "title": "Guías prácticas para herramientas y flujos de trabajo en el navegador",
    "description": "Artículos paso a paso, flujos probados y guías de referencia que respaldan las herramientas publicadas en JW Tool Box.",
    "post_eyebrow": "Entrada de blog",
    "read_more": "Leer más",
    "prev": "← Anterior",
    "next": "Siguiente →",
    "page_info": "Página {{current}} de {{total}}",
    "page_description": "Consulta {{total}} guías prácticas sobre PDF, imágenes, texto y desarrollo: tutoriales paso a paso que puedes seguir sin instalar nada. Página {{current}} de {{pages}}."
  },
  "blog_post": {
    "share_prompt": "¿Te gustó? Compártelo:",
    "back_to_blog": "Volver al blog",
    "last_updated": "Última actualización: {{date}}",
    "related_guides": "Guías relacionadas",
    "related_tools": "Herramientas recomendadas"
  },
  "about_page": {
    "meta_title": "Acerca de",
    "meta_description": "Aprende por qué existe JW Tool Box y cómo el proyecto sigue enviando utilidades de navegador que priorizan la privacidad para los flujos de trabajo diarios.",
    "eyebrow": "Acerca del proyecto",
    "title": "Un sitio mantenido a largo plazo para herramientas y guías de navegador.",
    "description": "JW Tool Box existe para publicar herramientas de navegador rápidas y útiles junto con guías realmente prácticas. El sitio se mantiene como un producto a largo plazo: explicar flujos, límites y decisiones con claridad, y evitar subidas innecesarias o barreras de registro siempre que sea posible.",
    "values": [
      {
        "title": "Nuestros principios",
        "body": "Muchas herramientas procesan archivos y textos compatibles directamente en el navegador."
      },
      {
        "title": "Gratis, sin registro",
        "body": "Usa las herramientas gratis, sin cuenta ni suscripción."
      },
      {
        "title": "Qué sigue",
        "body": "Internacionalización, más utilidades de texto y PDF, además de temas opcionales para que cada herramienta pueda coincidir con tu marca o contexto de inserción."
      }
    ],
    "explore_tools": "Explorar las herramientas",
    "privacy_commitments": "Compromisos de privacidad",
    "card_text": "Herramientas gratuitas de navegador para tareas cotidianas, sin registro."
  },
  "contact_page": {
    "meta_title": "Contacto",
    "meta_description": "Ponte en contacto sobre JW Tool Box. Los mensajes se envían a través de tu cliente de correo electrónico; no se almacenan datos.",
    "eyebrow": "Contacto",
    "title": "Ponte en contacto",
    "description": "Los mensajes se abren en tu propio cliente de correo, por lo que el sitio no almacena envíos. Úsalo para informar errores, solicitar funciones, corregir contenido o consultar colaboraciones.",
    "form": {
      "name": "Tu nombre (opcional)",
      "email": "Tu correo electrónico (responder a)",
      "subject": "Asunto",
      "message": "Mensaje",
      "send": "Enviar mensaje"
    },
    "placeholders": {
      "name": "Juan Pérez",
      "email": "tu@ejemplo.com",
      "subject": "Solicitud de función / Informe de error",
      "message": "¿Cómo puedo ayudarte?"
    },
    "status": {
      "error": "Por favor, proporciona tu correo electrónico, asunto y un mensaje corto.",
      "success": "Abriendo tu cliente de correo electrónico… Si no se abre nada, por favor envía el correo manualmente."
    }
  },
  "heic_to_image": {
    "title": "Convertidor HEIC a JPG/PNG",
    "description": "Convierte fotos Apple HEIC/HEIF a formatos estándar JPG o PNG localmente en tu navegador.",
    "msg_add_photos": "Por favor, añade algunas fotos HEIC primero.",
    "msg_add_first": "¡Añade archivos primero!",
    "msg_converting": "Convirtiendo…",
    "msg_done": "¡Hecho! Procesados {{count}} archivos.",
    "msg_failed": "Algo salió mal durante la conversión.",
    "add_more": "Añadir más fotos",
    "drag_drop": "Arrastra y suelta archivos HEIC aquí",
    "no_uploads": "Las fotos se procesan localmente; el sitio registra por separado datos de uso como se explica en la Política de privacidad.",
    "output_format": "Formato de salida",
    "format_hint": "Elige entre JPG (más pequeño) o PNG (sin pérdidas).",
    "jpg_quality": "Calidad JPG",
    "convert_title": "¿Listo para convertir?",
    "convert_desc": "Crearemos un archivo ZIP con tus imágenes convertidas.",
    "export_zip": "Exportar como ZIP {{format}}",
    "steps": "1. Añadir archivos -> 2. Elegir formato -> 3. Exportar",
    "photos_selected": "{{count}} foto seleccionada",
    "photos_selected_plural": "{{count}} fotos seleccionadas",
    "clear": "Limpiar",
    "png_hint": "PNG mantiene la transparencia; ideal para iconos/capturas de pantalla.",
    "converting_btn": "Convirtiendo…",
    "msg_partial": "Se convirtieron {count} de {total} archivos. El resto no se pudo decodificar y se omitió."
  },
  "url_encoder": {
    "error_encode": "Error al codificar el texto.",
    "error_decode": "Error al decodificar el texto.",
    "error_swap": "Error al intercambiar el texto.",
    "error_clipboard": "Error al copiar al portapapeles.",
    "swap": "Intercambiar",
    "clear": "Limpiar",
    "tip": "Escribe en cualquier cuadro para convertir al instante.",
    "layout": "Diseño",
    "split": "Dividir",
    "full_width": "Ancho completo",
    "original_text": "Texto original",
    "encoded_output": "Salida codificada",
    "copy": "Copiar",
    "copied": "¡Copiado!",
    "placeholder_encode": "Introduce texto para codificar…",
    "placeholder_decode": "Introduce texto para decodificar…",
    "char_count": "{{count}} caracteres"
  },
  "unit_converter": {
    "categories": {
      "length": "Longitud",
      "weight": "Peso",
      "temperature": "Temperatura",
      "volume": "Volumen"
    },
    "descriptions": {
      "length": "Convierte entre metros, pies, millas y más.",
      "weight": "Convierte entre kilogramos, libras, piedras, etc.",
      "temperature": "Convierte Celsius, Fahrenheit y Kelvin.",
      "volume": "Convierte litros, galones, tazas y otros volúmenes."
    },
    "labels": {
      "value": "Valor",
      "unit": "Unidad"
    },
    "units": {
      "meters": "Metros",
      "kilometers": "Kilómetros",
      "centimeters": "Centímetros",
      "miles": "Millas",
      "yards": "Yardas",
      "feet": "Pies",
      "inches": "Pulgadas",
      "kilograms": "Kilogramos",
      "grams": "Gramos",
      "pounds": "Libras",
      "ounces": "Onzas",
      "stone": "Piedra",
      "celsius": "Celsius",
      "fahrenheit": "Fahrenheit",
      "kelvin": "Kelvin",
      "liters": "Litros",
      "milliliters": "Mililitros",
      "cups_us": "Tazas (EE. UU.)",
      "tablespoons": "Cucharadas",
      "teaspoons": "Cucharaditas",
      "fluid_ounces": "Onzas líquidas",
      "gallons_us": "Galones (EE. UU.)"
    }
  },
  "base64": {
    "default_text": "Base64 mantiene el texto UTF-8 legible y compartible.",
    "error_encode": "No se puede codificar este texto.",
    "error_decode": "El valor codificado parece inválido. Comprueba los caracteres o el relleno.",
    "error_swap": "No se puede intercambiar porque el valor codificado es inválido.",
    "error_clipboard": "El portapapeles no está disponible en este navegador.",
    "swap": "Intercambiar valores",
    "clear": "Limpiar",
    "mode": "Modo:",
    "standard": "Estándar",
    "url_safe": "Seguro para URL",
    "keep_padding": "Mantener relleno",
    "hint_url": "El modo seguro para URL intercambia +/ por -_ . El relleno es opcional.",
    "hint_standard": "Base64 estándar conserva + y /. El relleno mantiene contentos a los navegadores.",
    "original_text": "Texto original",
    "base64_output": "Salida Base64",
    "copy": "Copiar",
    "copied": "¡Copiado!",
    "placeholder_encode": "Pega texto UTF-8 aquí para codificar…",
    "placeholder_decode": "Pega Base64 o Base64url para decodificar…",
    "stats_original": "Caracteres: {{count}} • Seguro UTF-8",
    "stats_encoded": "Longitud: {{count}} • Espacios en blanco ignorados al decodificar"
  },
  "bmi_calculator": {
    "categories": {
      "underweight": "Bajo peso",
      "normal_weight": "Peso normal",
      "overweight": "Sobrepeso",
      "obesity_1": "Obesidad clase I",
      "obesity_2": "Obesidad clase II",
      "obesity_3": "Obesidad clase III"
    },
    "labels": {
      "units": "Unidades",
      "reset": "Restablecer valores",
      "height_cm": "Altura (cm)",
      "weight_kg": "Peso (kg)",
      "height_ft": "Altura (pies)",
      "height_in": "Altura (pulgadas)",
      "weight_lb": "Peso (lb)"
    },
    "options": {
      "metric": "Métrico (cm / kg)",
      "imperial": "Imperial (ft / in / lb)"
    },
    "headings": {
      "bmi": "Índice de masa corporal",
      "categories": "Categorías de IMC"
    },
    "disclaimer": "Esta calculadora utiliza rangos de la Organización Mundial de la Salud. Consulta siempre a un profesional médico para obtener orientación personalizada."
  },
  "case_converter": {
    "uppercase": "MAYÚSCULAS",
    "lowercase": "minúsculas",
    "title_case": "Caso de Título",
    "sentence_case": "Caso de oración",
    "camel_case": "camelCase",
    "pascal_case": "PascalCase",
    "snake_case": "snake_case",
    "kebab_case": "kebab-case",
    "alternating_case": "aLtErNaDo",
    "inverse_case": "cAsO iNvErSo",
    "text_content": "Contenido de texto",
    "clear": "Limpiar",
    "copy_result": "Copiar resultado",
    "copied": "¡Copiado!",
    "placeholder": "Escribe o pega tu texto aquí…"
  },
  "code_formatter": {
    "language": "Lenguaje",
    "format_code": "Formatear código",
    "load_sample": "Cargar muestra",
    "clear": "Limpiar",
    "layout": "Diseño:",
    "split": "Dividir",
    "full_width": "Ancho completo",
    "source_code": "Código fuente",
    "formatted_output": "Salida formateada",
    "copy": "Copiar",
    "copied": "¡Copiado!",
    "error_clipboard": "El acceso al portapapeles fue bloqueado por este navegador.",
    "error_format": "No se puede formatear este fragmento. {{message}}",
    "hint": "Usa el formato Prettier en tu navegador sin instalar paquetes npm.",
    "chars": "Caracteres: {{count}}",
    "placeholder_input": "<!-- Pega tu código {{lang}} aquí -->",
    "placeholder_output": "Ejecuta el formato para ver la versión embellecida."
  },
  "color_converter": {
    "hex_label": "HEX",
    "hex_desc": "Soporta #RGB, #RRGGBB y #RRGGBBAA.",
    "rgb_label": "RGB",
    "rgb_desc": "Valores rgb() o rgba() aceptados.",
    "hsl_label": "HSL",
    "hsl_desc": "Valores hsl() o hsla() aceptados.",
    "swatch_hint": "Edita cualquier formato a la derecha y haz clic en Convertir para actualizar esta muestra.",
    "convert": "Convertir",
    "copy": "Copiar",
    "copied": "¡Copiado!",
    "css_var_label": "Variables CSS pegables:",
    "error_parse": "No se pudo analizar ese valor. Comprueba el formato.",
    "invalid_hex": "Color HEX inválido.",
    "invalid_rgb": "Color RGB inválido.",
    "error_clipboard": "Acceso al portapapeles no disponible."
  },
  "countdown_timer": {
    "presets": {
      "5_min": "5 min",
      "15_min": "15 min",
      "25_min": "25 min",
      "45_min": "45 min"
    },
    "error_duration": "Por favor, establece una duración mayor que cero.",
    "hours": "Horas",
    "minutes": "Minutos",
    "seconds": "Segundos",
    "remaining": "Restante",
    "times_up_msg": "¡Se acabó el tiempo! Tómate un descanso o establece otra sesión.",
    "pause": "Pausa",
    "start": "Iniciar",
    "reset": "Reiniciar",
    "local_hint": "El temporizador se ejecuta localmente incluso si tu conexión se cae.",
    "demo": "Demo en vivo — pulsa cualquier botón para tomar el control",
    "finished": "Terminado",
    "times_up_title": "¡Se acabó el tiempo!",
    "times_up_desc": "Aléjate, estírate o comienza otro bloque cuando estés listo.",
    "reset_timer": "Reiniciar temporizador",
    "dismiss": "Descartar",
    "resume": "Continuar",
    "sound_enabled": "Aviso sonoro",
    "test_sound": "Probar sonido",
    "fullscreen": "Pantalla completa",
    "exit_fullscreen": "Salir de pantalla completa",
    "audio_unavailable": "El sonido no está disponible o está bloqueado. Comprueba el navegador y el volumen; el aviso visual sigue funcionando.",
    "background_hint": "Mantén esta pestaña abierta. El tiempo se ajusta al volver de otra pestaña. Bloquear el móvil o suspender el navegador puede retrasar la alarma."
  },
  "csv_json_converter": {
    "error_json_array": "JSON debe ser un array de objetos.",
    "error_unsupported": "Ruta de conversión no soportada.",
    "error_convert": "No se puede convertir. Comprueba tus datos.",
    "error_clipboard": "El portapapeles no está disponible.",
    "input": "Entrada",
    "output": "Salida",
    "swap": "Intercambiar",
    "clear": "Limpiar",
    "convert": "Convertir",
    "header_hint": "La fila de encabezado es obligatoria al convertir CSV/TSV a JSON.",
    "copied": "¡Copiado!",
    "copy": "Copiar",
    "placeholder_output": "La salida convertida aparecerá aquí…"
  },
  "date_calculator": {
    "mode_difference": "Diferencia de fechas",
    "mode_add_subtract": "Sumar / Restar días",
    "start_date": "Fecha de inicio",
    "end_date": "Fecha de fin",
    "difference": "Diferencia",
    "days": "días",
    "years": "años",
    "months": "meses",
    "breakdown": "o {{years}} años, {{months}} meses, {{days}} días",
    "add": "Sumar (+)",
    "subtract": "Restar (-)",
    "unit_days": "Días",
    "unit_weeks": "Semanas",
    "unit_months": "Meses",
    "unit_years": "Años",
    "result_date": "Fecha resultante",
    "preset_years_days": "Calcular 2 años y 320 días desde hoy",
    "unit_years_days": "Años + días",
    "extra_days": "Días adicionales",
    "years_days_hint": "Primero se suman los años y después los días naturales. Si la fecha no existe, se usa el último día del mes.",
    "invalid_date": "Introduce una fecha válida entre los años 100 y 9999.",
    "operation": "Operación",
    "quantity": "Cantidad",
    "unit": "Unidad",
    "include_end": "Contar ambas fechas (sumar un día)",
    "calculate": "Calcular días",
    "inclusive_hint": "Se incluyen ambas fechas, los fines de semana y los festivos.",
    "exclusive_hint": "Se excluye la fecha inicial; se cuentan los fines de semana y los festivos."
  },
  "favicon_generator": {
    "error_canvas": "Canvas no soportado",
    "error_render": "No se puede renderizar el icono",
    "error_select_size": "Selecciona al menos un tamaño de icono.",
    "success_msg": "¡Iconos generados! La descarga del ZIP ha comenzado.",
    "error_generate": "Error al generar archivos de favicon. Por favor, inténtalo de nuevo.",
    "letters_emoji": "Letras o emoji",
    "bg_color": "Color de fondo",
    "text_color": "Color del texto",
    "font_size": "Tamaño de fuente",
    "padding": "Relleno",
    "preview": "Vista previa",
    "format_hint": "Formatos de salida: PNG dentro de un archivo ZIP.",
    "usage_hint": "Usa hasta dos letras o un emoji para obtener mejores resultados.",
    "include_sizes": "Incluir tamaños",
    "download_zip": "Descargar ZIP de favicon"
  },
  "hash_generator": {
    "input_label": "Texto de entrada",
    "uppercase": "Salida en mayúsculas",
    "generate": "Generar hashes",
    "copy": "Copiar",
    "placeholder_result": "Ejecuta el generador para ver este hash.",
    "error_unsupported": "No soportado en este navegador."
  },
  "image_compressor": {
    "target_mode": "Intentar menos de 200 KB por imagen",
    "target_hint": "Opcional: reduce ancho y calidad, hasta 320 px y 40%. 200 KB son 200.000 bytes; no se garantiza alcanzar el límite.",
    "prepare_target": "Preparar imágenes de menos de 200 KB",
    "results_title": "Resultados de exportación",
    "result_details": "{{bytes}} bytes · {{width}} × {{height}} px · {{quality}}% de calidad",
    "target_met": "Menos de 200.000 bytes",
    "target_missed": "Límite no alcanzado. Prueba un recorte menor u otro formato.",
    "review_hint": "Abre la imagen descargada, o extrae el ZIP si son varias, y revisa el texto y los detalles antes de enviarla.",
    "download_results": "Descargar ZIP de resultados",
    "title": "Comprimir y convertir imágenes",
    "description": "Comprime JPG/PNG/WebP localmente. Descarga una imagen directamente o varias juntas en un ZIP.",
    "max_width": "Ancho máximo (px)",
    "quality": "Calidad",
    "output_format": "Formato de salida",
    "drag_drop": "Haz clic o arrastra archivos para subir",
    "supports_hint": "Soporta JPG / PNG / WebP; mantén cada archivo por debajo de ~10 MB para un mejor rendimiento.",
    "selected_files": "Seleccionado(s) {{count}} imagen(es) - {{size}} total",
    "clear": "Limpiar",
    "remove": "Eliminar",
    "tip_multiple": "Una imagen se descarga directamente; varias se descargan en un ZIP.",
    "compress_zip_btn": "Comprimir y descargar ZIP",
    "processing": "Procesando…",
    "msg_done": "¡Listo! {{count}} imagen(es) procesada(s). Tamaño original total: {{size}}.",
    "error_failed": "La compresión falló. Por favor, asegúrate de que los archivos sean válidos e inténtalo de nuevo.",
    "error_files_limit": "Elige imágenes JPG/PNG/WebP de hasta 20 MiB cada una.",
    "error_skipped": "Se omitieron archivos de más de 20 MiB.",
    "error_select_one": "Por favor, selecciona al menos una imagen.",
    "compress_image_btn": "Comprimir y descargar imagen",
    "download_image": "Descargar imagen",
    "size_comparison": "Original: {{original}} → Resultado: {{output}}"
  },
  "image_resizer": {
    "title": "Redimensionador de imágenes",
    "description": "Redimensiona imágenes a dimensiones específicas y convierte formatos.",
    "upload_btn": "Subir imagen",
    "selected": "Seleccionado: {{name}} ({{size}} KB)",
    "supported": "Soportado: PNG, JPG, WebP, HEIC (si es compatible)",
    "settings_title": "Ajustes de redimensionamiento",
    "max_width": "Ancho máximo (px)",
    "max_height": "Alto máximo (px)",
    "keep_aspect": "Mantener relación de aspecto",
    "output_format": "Formato de salida",
    "format_webp": "WebP (más pequeño)",
    "format_jpeg": "JPEG",
    "format_png": "PNG (sin pérdidas)",
    "quality": "Calidad ({{value}}%)",
    "original_dims": "Original: {{width}} × {{height}}px",
    "target_dims": "Objetivo: {{width}} × {{height}}px",
    "resize_btn": "Redimensionar y convertir",
    "download_btn": "Descargar resultado",
    "preview_title": "Vista previa",
    "output_title": "Salida redimensionada",
    "output_info": "{{width}} × {{height}}px · {{format}} · {{size}} KB",
    "error_upload_first": "Por favor, sube una imagen primero.",
    "error_read": "Error al leer la imagen.",
    "error_canvas": "Canvas no soportado en este navegador.",
    "error_encode": "No se pudo codificar la imagen.",
    "error_load": "No se pudo cargar esta imagen."
  },
  "images_to_pdf": {
    "title": "Convertir imágenes en un solo PDF",
    "description": "Combina múltiples archivos JPG/PNG en un PDF limpio—perfecto para recibos, escaneos o compartir un paquete rápido.",
    "add_more": "Añadir más imágenes (JPG/PNG)",
    "drag_drop": "Haz clic o arrastra imágenes JPG/PNG",
    "limit_hint": "Hasta 40 imágenes. El orden sigue la lista a continuación.",
    "selected": "{{count}} imagen seleccionada",
    "selected_plural": "{{count}} imágenes seleccionadas",
    "clear": "Limpiar",
    "max_page_width": "Ancho máximo de página",
    "width_hint": "Las imágenes más grandes que este ancho se reducen.",
    "create_pdf": "Crear PDF",
    "create_hint": "Las imágenes permanecen en orden. Todo se ejecuta en tu navegador.",
    "building": "Construyendo…",
    "export_pdf": "Exportar PDF",
    "steps": "Paso 1: Añadir imágenes. Paso 2: Establecer ancho máximo. Paso 3: Exportar PDF.",
    "msg_choose_images": "Elige imágenes JPG o PNG.",
    "msg_add_one": "Añade al menos una imagen.",
    "msg_building": "Construyendo PDF localmente. Mantén esta pestaña abierta.",
    "msg_ready": "PDF listo. La descarga comenzó automáticamente.",
    "msg_failed": "La conversión falló. Prueba con menos imágenes o reduce el ancho máximo."
  },
  "json_formatter": {
    "title": "Formateador JSON",
    "description": "Formatea, valida y minifica datos JSON.",
    "format_btn": "Formatear JSON",
    "minify_btn": "Minificar",
    "load_sample": "Cargar muestra",
    "clear": "Limpiar",
    "paste_hint": "Pega JSON a la izquierda, luego copia la salida formateada a la derecha.",
    "layout": "Diseño:",
    "split": "Dividir",
    "full_width": "Ancho completo",
    "input_label": "Entrada",
    "output_label": "Salida formateada",
    "copy": "Copiar",
    "copied": "¡Copiado!",
    "chars": "Caracteres: {{count}}",
    "error_invalid": "JSON es inválido. {{reason}}",
    "error_clipboard": "El acceso al portapapeles fue bloqueado por este navegador.",
    "placeholder_input": "{ \"nombre\": \"JW Tool Box\" }",
    "placeholder_output": "Tu bonito JSON aparecerá aquí."
  },
  "jwt_decoder": {
    "title": "Decodificador JWT",
    "description": "Decodifica JSON Web Tokens (JWT) para ver su encabezado y carga útil.",
    "token_label": "Token JWT",
    "placeholder": "Pega tu JWT aquí (header.payload.signature)",
    "decode_btn": "Decodificar",
    "clear_btn": "Limpiar",
    "header_label": "Encabezado",
    "payload_label": "Carga útil",
    "copy": "Copiar",
    "copied": "¡Copiado!",
    "common_claims": "Reclamaciones comunes",
    "signature_label": "Firma (base64url):",
    "verification_hint": "La verificación no se realiza aquí. Valida las firmas en el lado del servidor con la clave y el algoritmo correctos.",
    "error_invalid": "El JWT debe tener al menos un encabezado y una carga útil.",
    "error_decode": "No se puede decodificar este token.",
    "error_clipboard": "El portapapeles no está disponible."
  },
  "keep_screen_on": {
    "title_active": "El bloqueo de activación de pantalla está activo",
    "title_inactive": "Mantén tu pantalla despierta",
    "desc_unsupported": "Tu navegador no soporta la API Wake Lock, pero puedes usar los consejos manuales a continuación.",
    "desc_supported": "Inicia el bloqueo de activación y mantén esta pestaña en primer plano. Intentaremos volver a aplicarlo si el navegador lo suspende.",
    "btn_running": "Ejecutando…",
    "btn_start": "Iniciar mantener despierto",
    "btn_stop": "Detener",
    "error_unsupported": "La API Wake Lock no es compatible con este navegador.",
    "error_request": "No se puede mantener la pantalla despierta. Intenta interactuar con la página de nuevo.",
    "local_time": "Hora local",
    "session_timer": "Temporizador de sesión",
    "timer_hint_active": "Tiempo desde que comenzó el bloqueo de activación",
    "timer_hint_inactive": "Inicia el bloqueo de activación para comenzar el seguimiento",
    "tips": {
      "ios_title": "iOS / Safari",
      "ios_body": "Abre Configuración → Pantalla y brillo → Bloqueo automático → elige “Nunca”. Alternativamente, habilita el Acceso guiado para la aplicación actual.",
      "android_title": "Android (sin soporte de bloqueo de activación)",
      "android_body": "Usa Configuración → Pantalla → Tiempo de espera de pantalla, o habilita Opciones de desarrollador → Permanecer despierto mientras se carga.",
      "desktop_title": "Escritorio",
      "desktop_body": "Ajusta la configuración de energía de tu sistema operativo para evitar que la pantalla se apague durante demostraciones o grabaciones largas."
    }
  },
  "lorem_ipsum": {
    "count": "Cantidad",
    "unit": "Unidad",
    "unit_paragraphs": "Párrafos",
    "unit_sentences": "Oraciones",
    "unit_words": "Palabras",
    "classic_opening": "Apertura clásica",
    "copy_output": "Copiar salida",
    "copied": "¡Copiado!",
    "output": "Texto generado"
  },
  "markdown_converter": {
    "md_to_html": "Markdown → HTML",
    "html_to_md": "HTML → Markdown",
    "copy_output": "Copiar salida",
    "copied": "¡Copiado!",
    "layout": "Diseño:",
    "split": "Dividir",
    "full_width": "Ancho completo",
    "description": "Selecciona una dirección arriba, pega tu contenido en el panel izquierdo y copia el resultado convertido a la derecha. La renderización HTML es impulsada por markdown-it; la conversión inversa utiliza Turndown.",
    "md_input": "Entrada Markdown",
    "html_input": "Entrada HTML",
    "md_output": "Salida Markdown",
    "html_output": "Salida HTML"
  },
  "money_to_words": {
    "title": "Convertidor de dinero a palabras",
    "description": "Convierte cantidades numéricas en palabras en inglés escritas para cheques, documentos legales o claridad.",
    "enter_amount": "Introduce la cantidad",
    "placeholder": "ej. 1234.56",
    "quick_history": "Historial rápido",
    "history_empty": "Aún no hay historial.",
    "convert_btn": "Convertir a palabras",
    "error_invalid": "Por favor, introduce un número válido.",
    "label_sentence": "Caso de oración",
    "label_uppercase": "Mayúsculas",
    "label_check": "Línea de cheque",
    "label_memo": "Línea de nota",
    "label_currency": "Formato de moneda",
    "copied": "¡Copiado!",
    "copy": "Copiar",
    "check_guide_title": "Cómo escribir un cheque de EE. UU.",
    "check_guide_step1": "Escribe la fecha de hoy en el cuadro superior derecho.",
    "check_guide_step2": "Rellena la línea “Pagar a la orden de” con el nombre del destinatario.",
    "check_guide_step3": "Introduce la cantidad numérica (ej., {{amount}}) en el cuadro, alineada a la izquierda.",
    "check_guide_step4": "Usa la salida <strong>LÍNEA DE CHEQUE</strong> de esta herramienta en la línea de cantidad en palabras, terminando con “DÓLARES”.",
    "check_guide_step5": "Opcionalmente añade una nota/propósito (número de factura, regalo, etc.).",
    "check_guide_step6": "Firma el cheque—solo tinta—y guarda una foto o talón para tus registros.",
    "check_guide_tip": "Consejo extra: añade “***” o “#” antes y después de la cantidad escrita para evitar manipulaciones.",
    "error_copy": "No se pudo copiar. Selecciona el resultado y cópialo manualmente."
  },
  "mortgage_calculator": {
    "cta_label": "Calcular hipoteca",
    "summary_title": "Resumen de hipoteca",
    "notes": "Esta calculadora proporciona estimaciones solo con fines informativos. Los pagos reales pueden variar."
  },
  "auto_loan_calculator": {
    "cta_label": "Planificar este préstamo de auto",
    "summary_title": "Costo total de propiedad",
    "notes": "Añade impuestos, tarifas del concesionario o garantías al precio de compra si quieres que se incluyan en el préstamo.",
    "vehicle_price": "Precio del vehículo",
    "down_payment": "Pago inicial",
    "interest_rate": "Tasa de interés (%)",
    "term_years": "Plazo del préstamo",
    "term_input_mode": "Modo de entrada de plazo",
    "months": "Meses",
    "years": "Años",
    "monthly_payment": "Pago mensual",
    "total_interest": "Interés total",
    "payment_breakdown": "Desglose de pagos",
    "total_paid": "Total pagado",
    "principal_loan_amount": "Monto principal del préstamo"
  },
  "pdf_compressor": {
    "title": "Comprimir PDF",
    "description": "Reduce el tamaño del archivo PDF localmente en tu navegador.",
    "drag_drop": "Haz clic o suelta PDF",
    "presets": {
      "balanced_label": "Equilibrado",
      "balanced_desc": "Mantén el texto nítido y reduce el peso de la imagen ~40%.",
      "small_label": "Más pequeño",
      "small_desc": "Genial para subidas de correo electrónico y portales de intercambio.",
      "tiny_label": "El más pequeño",
      "tiny_desc": "Aplana agresivamente para el archivo más pequeño."
    },
    "compress_btn": "Comprimir PDF",
    "download_btn": "Descargar PDF comprimido",
    "processing": "Comprimiendo…",
    "error_file_type": "Por favor, sube un archivo PDF.",
    "error_file_size": "Prueba un PDF de menos de 30 MB para mantener las cosas receptivas.",
    "error_no_file": "Añade un PDF primero.",
    "msg_rendering": "Renderizando páginas localmente. Mantén esta pestaña abierta.",
    "progress": "Progreso",
    "msg_failed": "La compresión falló. Por favor, inténtalo de nuevo.",
    "msg_done": "¡Compresión completa! Reducido en {{percent}}%.",
    "original_size": "Tamaño original",
    "compressed_size": "Tamaño comprimido",
    "change_file": "Cambiar archivo PDF",
    "preset_title": "Preajuste",
    "preset_description": "Elige cuánto reducir las páginas. La escala reduce las dimensiones de la página, la calidad establece la claridad JPEG. Números más bajos = archivo más pequeño.",
    "download_title": "Descargar PDF comprimido",
    "download_description": "Usa el preajuste seleccionado y el archivo actual para crear un PDF más pequeño.",
    "steps": "Paso 1: Subir PDF. Paso 2: Elegir un preajuste. Paso 3: Comprimir y descargar.",
    "heads_up": "Aviso",
    "heads_up_list": {
      "local": "La compresión es 100% local; los PDF sensibles nunca salen de tu navegador.",
      "flatten": "Las páginas se aplanan en imágenes. Mantén los originales si necesitas texto seleccionable.",
      "quality": "Los preajustes de menor calidad cambian claridad por archivos más pequeños.",
      "loses_text": "Cada página se vuelve a renderizar como imagen, por lo que el texto seleccionable o buscable se aplana. Si necesitas conservar el texto, no uses esta herramienta."
    },
    "scale": "Escala",
    "quality": "Calidad",
    "msg_no_savings": "El archivo no se redujo con este preajuste. Se conservó el original: prueba el preajuste «Más pequeño» para la máxima reducción."
  },
  "pdf_lock_unlock": {
    "title_unlock": "Desbloquear un PDF con contraseña (local)",
    "description_unlock": "Elimina la seguridad de contraseña de un archivo PDF.",
    "drag_drop": "Haz clic o suelta PDF",
    "password_label": "Contraseña PDF",
    "unlock_btn": "Desbloquear PDF",
    "unlocking": "Desbloqueando…",
    "error_file_type": "Por favor, sube un archivo PDF.",
    "error_file_size": "Prueba un PDF de menos de ~60 MB para un procesamiento más fluido.",
    "error_no_file": "Sube un PDF primero.",
    "error_no_password": "Introduce la contraseña correcta del PDF.",
    "msg_unlocking": "Desbloqueando localmente. Las páginas se reconstruirán sin contraseña.",
    "msg_password_required": "Se requiere contraseña para abrir este PDF.",
    "msg_incorrect_password": "Contraseña incorrecta. Por favor, inténtalo de nuevo.",
    "msg_success": "Copia desbloqueada creada. Descarga iniciada.",
    "msg_failed": "El desbloqueo falló. Comprueba la contraseña o prueba un PDF más pequeño.",
    "change_file": "Cambiar archivo PDF",
    "drag_drop_hint": "Haz clic o arrastra un PDF con contraseña (recomendado < 60 MB)",
    "local_hint": "Las operaciones de contraseña ocurren localmente; mantén la pestaña abierta mientras se procesa.",
    "password_title": "Contraseña",
    "password_description": "Introduce la contraseña actual del PDF para desbloquear y reconstruir.",
    "password_placeholder": "Contraseña existente",
    "unlock_title": "Desbloquear PDF",
    "unlock_description": "Renderiza páginas para eliminar la contraseña; mantén los originales si necesitas texto seleccionable o campos de formulario.",
    "steps": "Paso 1: Subir PDF con contraseña. Paso 2: introducir contraseña. Paso 3: Desbloquear y descargar.",
    "progress_hint": "Mantén esta pestaña abierta hasta que comience la descarga del archivo.",
    "heads_up": "Aviso",
    "heads_up_list": {
      "local": "Todo el procesamiento es local; los PDF nunca se suben a un servidor.",
      "rebuild": "El desbloqueo reconstruye las páginas como imágenes; mantén los originales si necesitas texto seleccionable o campos de formulario.",
      "security": "Usa contraseñas seguras y guárdalas de forma segura. Las contraseñas perdidas no se pueden recuperar."
    }
  },
  "pdf_merge": {
    "title": "Unir PDFs",
    "description": "Combina múltiples archivos PDF en uno solo.",
    "drag_drop": "Haz clic o suelta PDFs",
    "add_more": "Añadir más PDFs",
    "merge_btn": "Unir PDFs",
    "merging": "Uniendo…",
    "clear_all": "Borrar todo",
    "error_file_type": "Por favor, sube archivos PDF.",
    "error_file_size": "Por favor, sube archivos PDF de menos de 15 MB cada uno.",
    "error_some_skipped": "Algunos PDF se omitieron porque superan el límite de 15 MB.",
    "msg_success": "¡PDF unido creado! Descarga iniciada.",
    "msg_failed": "La unión falló. Por favor, inténtalo de nuevo.",
    "total_size": "Tamaño total: {{size}}",
    "drag_drop_hint": "Haz clic o arrastra para añadir PDFs",
    "drag_drop_subhint": "Selecciona varios archivos a la vez para flujos de trabajo más rápidos.",
    "selected_files": "Seleccionado(s) {{count}} archivo(s) (total {{size}})",
    "clear_list": "Borrar lista",
    "move_up": "Arriba",
    "move_down": "Abajo",
    "remove": "X",
    "tip": "Consejo: mantén presionado Shift o Cmd/Ctrl para seleccionar múltiples PDF en tu selector de archivos.",
    "merge_download": "Unir y descargar",
    "processing": "Procesando…"
  },
  "pdf_page_organizer": {
    "title": "Organizar páginas PDF",
    "description": "Reordena, rota o elimina páginas de un PDF.",
    "drag_drop": "Haz clic o suelta PDF",
    "save_btn": "Guardar y descargar",
    "saving": "Guardando…",
    "rotate_left": "Rotar a la izquierda",
    "rotate_right": "Rotar a la derecha",
    "delete_page": "Eliminar página",
    "error_file_type": "Por favor, sube un archivo PDF.",
    "error_file_size": "Prueba un PDF de menos de ~50 MB para un reordenamiento más fluido.",
    "error_read_failed": "Error al leer el PDF. Prueba otro archivo.",
    "msg_saved": "¡Nuevo PDF creado! Descarga iniciada.",
    "msg_failed": "Error al guardar el PDF.",
    "change_file": "Cambiar archivo PDF",
    "drag_drop_hint": "Haz clic o arrastra un PDF de hasta ~50 MB",
    "local_hint": "Las páginas permanecen en tu dispositivo—sin subidas.",
    "pages_count": "Páginas: {{count}}",
    "order_rotation_title": "Orden y rotación de páginas",
    "order_rotation_desc": "Mover páginas arriba/abajo; rotar en pasos de 90°.",
    "page_label": "Página {{index}}",
    "preview_unavailable": "Vista previa no disponible",
    "move_up": "↑ Arriba",
    "move_down": "↓ Abajo",
    "rotate_left_btn": "↺ Rotar -90°",
    "rotate_right_btn": "↻ Rotar +90°",
    "export_title": "Exportar PDF ordenado",
    "export_desc": "Mantiene tu orden y rotaciones. Permanece local.",
    "export_btn": "Exportar PDF",
    "exporting": "Exportando…",
    "steps": "Paso 1: Subir PDF. Paso 2: reordenar/rotar. Paso 3: Exportar.",
    "msg_upload_first": "Sube un PDF y organiza las páginas primero.",
    "msg_rebuilding": "Reconstruyendo PDF localmente. Mantén esta pestaña abierta.",
    "msg_done": "Hecho. La descarga comenzó automáticamente.",
    "msg_failed_export": "La exportación falló. Prueba un PDF más pequeño o menos ediciones."
  },
  "salary_tax_calculator": {
    "title": "Calculadora de impuestos salariales (EE. UU.)",
    "description": "Estima el impuesto federal usando estado civil, tramos de 2025 y la deduccion estandar.",
    "income_label": "Ingreso anual",
    "status_label": "Estado civil",
    "status_single": "Soltero",
    "status_married": "Casado presentando conjuntamente",
    "status_separate": "Casado presentando por separado",
    "status_head": "Cabeza de familia",
    "calculate_btn": "Calcular impuesto",
    "summary_title": "Resumen de impuestos estimados",
    "total_tax": "Impuesto federal total",
    "effective_rate": "Tasa impositiva efectiva",
    "take_home": "Ingreso neto anual",
    "bracket_breakdown": "Desglose de tramos impositivos",
    "bracket_header": "Tramo",
    "rate_header": "Tasa",
    "tax_header": "Monto del impuesto",
    "disclaimer": "La estimacion usa tramos federales de 2025 y la deduccion estandar. No incluye FICA, impuestos estatales o locales, creditos ni deducciones detalladas."
  },
  "text_diff": {
    "title": "Herramienta de diferencias de texto",
    "description": "Compara dos bloques de texto para encontrar diferencias.",
    "original_label": "Texto original",
    "modified_label": "Texto modificado",
    "diff_result": "Resultado de la diferencia",
    "legend_removed": "Eliminado",
    "legend_added": "Añadido",
    "no_changes": "No se encontraron cambios. Los textos son idénticos.",
    "clear_btn": "Borrar todo",
    "original_placeholder": "Pega el texto original…",
    "modified_placeholder": "Pega el texto modificado…",
    "copied": "¡Diferencia copiada!",
    "copy_summary": "Copiar resumen de diferencias",
    "layout": "Diseño:",
    "split": "Dividir",
    "full_width": "Ancho completo",
    "legend_green": "Inserciones = verde",
    "legend_red": "Eliminaciones = rojo",
    "legend_whitespace": "Espacio en blanco preservado"
  },
  "uuid_generator": {
    "title": "Generador UUID",
    "description": "Genera UUIDs aleatorios (v4) localmente en tu navegador.",
    "generate_button": "Generar UUIDs",
    "result_title": "UUIDs generados",
    "copy_all": "Copiar todo",
    "count_label": "¿Cuántos?",
    "uppercase_label": "Mayúsculas",
    "hyphens_label": "Eliminar guiones",
    "copied": "¡Copiado!",
    "copy_tooltip": "Haz clic para copiar"
  },
  "word_counter": {
    "title": "Contador de palabras",
    "description": "Cuenta palabras, caracteres, oraciones y estima el tiempo de lectura.",
    "placeholder": "Escribe o pega tu texto aquí…",
    "stat_words": "Palabras",
    "stat_chars": "Caracteres",
    "stat_no_spaces": "Sin espacios",
    "stat_paragraphs": "Párrafos",
    "stat_sentences": "Oraciones",
    "stat_read_time": "Tiempo de lectura",
    "copy_text": "Copiar texto",
    "clear_text": "Borrar texto",
    "min": "min"
  },
  "world_time": {
    "title": "Convertidor de hora mundial",
    "description": "Consulta la hora en múltiples zonas horarias.",
    "search_placeholder": "Buscar ciudad o zona horaria…",
    "base_time": "Hora base",
    "auto_update": "Actualizar automáticamente la hora actual",
    "remove_zone": "Eliminar",
    "add_btn": "Añadir",
    "copy_timestamp": "Copiar hora"
  },
  "pdf_split": {
    "title": "Dividir PDF",
    "description": "Extrae páginas o divide un PDF en múltiples archivos.",
    "drag_drop": "Haz clic o arrastra PDF",
    "range_mode": "Extraer rango",
    "extract_all": "Dividir cada página",
    "start_page": "Página de inicio",
    "end_page": "Página final",
    "split_btn": "Dividir PDF",
    "processing": "Procesando…",
    "error_file_type": "Por favor, sube un archivo PDF.",
    "error_file_size": "Este PDF es mayor de 50 MB.",
    "msg_success": "¡División completa! Descarga iniciada.",
    "msg_failed": "La división falló."
  },
  "pdf_to_image": {
    "title": "PDF a imagen",
    "description": "Convierte páginas PDF a imágenes JPG o PNG.",
    "drag_drop": "Haz clic o arrastra PDF",
    "format_label": "Formato de salida",
    "quality_label": "Calidad",
    "convert_btn": "Convertir a imágenes",
    "processing": "Renderizando páginas…",
    "error_file_type": "Por favor, sube un archivo PDF.",
    "error_file_size": "Prueba un PDF de menos de 40 MB.",
    "msg_success": "¡Conversión completa! Descarga iniciada.",
    "current_file": "Archivo actual: {{name}}",
    "size_mb": "Tamaño: {{size}} MB",
    "remove": "Eliminar",
    "format_hint_text": "Elige formato y calidad para las páginas exportadas.",
    "quality_hint": "Mayor calidad = archivos más grandes.",
    "png_hint": "PNG mantiene la transparencia; mejor para gráficos y escaneos.",
    "download_title": "Descargar imágenes",
    "download_desc": "Exporta un ZIP con una imagen por página usando el formato seleccionado.",
    "steps": "Paso 1: Subir PDF. Paso 2: Elegir formato. Paso 3: Exportar ZIP.",
    "progress": "Progreso",
    "keep_open": "Mantén esta pestaña abierta hasta que comience la descarga del ZIP.",
    "heads_up": "Aviso",
    "note_privacy": "El procesamiento permanece en tu dispositivo; los PDF nunca se suben.",
    "note_large": "Los PDF grandes pueden tardar—prueba JPEG para descargas más pequeñas o menor calidad si es necesario.",
    "note_scale": "Las páginas se renderizan a escala 2× para imágenes más nítidas. Redimensiona después de descargar si es necesario."
  },
  "pinyin_converter": {
    "title": "Convertidor de Pinyin chino",
    "description": "Convierte caracteres chinos a Pinyin con tonos.",
    "input_placeholder": "Pega texto chino aquí…",
    "mode_tone_mark": "Marcas de tono (mā)",
    "mode_tone_number": "Números de tono (ma1)",
    "mode_initials": "Solo iniciales (m)",
    "copy": "Copiar Pinyin",
    "copied": "¡Copiado!"
  },
  "random_generator": {
    "title": "Generador de números y selector aleatorio",
    "description": "Genera números aleatorios o elige elementos de una lista.",
    "mode_number": "Generador de números",
    "mode_picker": "Selector de lista",
    "min": "Mín",
    "max": "Máx",
    "quantity": "Cantidad",
    "allow_duplicates": "Permitir duplicados",
    "generate_btn": "Generar números",
    "list_placeholder": "Introduce elementos, uno por línea…",
    "pick_count": "¿Cuántos elegir?",
    "pick_btn": "Elegir elemento aleatorio",
    "result_label": "Resultado",
    "error_range": "La cantidad excede el tamaño del rango."
  },
  "regex_tester": {
    "title": "Probador de Regex",
    "description": "Prueba expresiones regulares contra texto en tiempo real.",
    "pattern_label": "Patrón Regex",
    "flags_label": "Banderas",
    "text_label": "Cadena de prueba",
    "matches_label": "Coincidencias",
    "match_count_result": "{{count}} encontradas",
    "no_matches": "No se encontraron coincidencias",
    "found": "Encontrado",
    "group": "Grupo",
    "empty": "Vacío",
    "error_invalid": "Expresión regular inválida.",
    "suggestions": "Patrones comunes",
    "patterns": {
      "email": "Correo electrónico",
      "us_phone": "Teléfono EE.UU.",
      "ipv4": "IPv4",
      "hex": "Color Hex",
      "invoice": "ID Factura"
    },
    "flags": {
      "global": "Global",
      "ignore_case": "Ignorar mayúsculas",
      "multiline": "Multilínea",
      "dot_all": "DotAll",
      "unicode": "Unicode"
    },
    "group_label": "Grupo {{index}}",
    "empty_input": "Enter a regex pattern and test string to see matches."
  },
  "loan_calculator": {
    "purchase_price": "Precio de compra",
    "down_payment": "Pago inicial",
    "apr": "APR (%)",
    "term": "Plazo",
    "months": "meses",
    "years": "años",
    "property_tax": "Impuesto a la propiedad (anual $)",
    "annual_insurance": "Seguro anual ($)",
    "hoa_monthly_fee": "Cuota mensual de HOA ($)",
    "monthly_payment": "Pago mensual",
    "principal_interest": "Principal e interés",
    "estimated_taxes": "Impuestos estimados",
    "insurance": "Seguro",
    "hoa": "HOA",
    "total_paid_over": "Total pagado durante",
    "interest": "Interés:",
    "principal": "Principal:",
    "loan_amount": "Monto del préstamo",
    "after_down_payment": "Después del pago inicial",
    "payment_breakdown": "Desglose de pagos",
    "total_paid": "Total pagado"
  },
  "privacy_page": {
    "meta_title": "Política de Privacidad",
    "meta_description": "Consulte qué datos se procesan en su dispositivo y qué información pueden recibir los servicios de análisis, alojamiento y publicidad.",
    "eyebrow": "Política de privacidad",
    "title": "Cómo trata JW Tool Box los datos",
    "subtitle": "Actualizado el 30 de septiembre de 2026. Resumen del tratamiento de datos de las herramientas, el sitio, el alojamiento y la publicidad.",
    "sections": [
      {
        "title": "Procesamiento de herramientas",
        "body": "La mayoría de las herramientas procesan en su navegador el texto o los archivos que proporciona. JW Tool Box no carga ni almacena intencionadamente el contenido que introduce ni los archivos que procesa. Algunas páginas o vistas previas pueden conectarse con otros sitios; el conversor Markdown muestra HTML sin procesar y el navegador puede solicitar los recursos remotos incluidos en ese HTML. Al cargar el sitio, el navegador también envía solicitudes normales a nuestros proveedores de alojamiento y distribución de contenido."
      },
      {
        "title": "Actividad del sitio y las herramientas",
        "body": "Al visitar el sitio, Google Analytics y Microsoft Clarity se cargan mediante Google Tag Manager para registrar actividad de páginas y herramientas. Los eventos pueden incluir URL y títulos de páginas, idioma, datos del navegador o dispositivo, referencia, acciones de herramientas y algunos ajustes. Por ejemplo, la calculadora salarial envía actualmente un tramo de ingresos y el estado civil fiscal; el temporizador envía la duración elegida; y el convertidor de importes indica si se introdujeron céntimos y cuántos dígitos tenía la parte entera. No enviamos intencionadamente el salario completo, el texto introducido ni el contenido de archivos en estos eventos personalizados. Microsoft Clarity también ofrece analíticas de sesión e interacción; Microsoft indica que el contenido de los campos de entrada se oculta de forma predeterminada. El alojamiento de Cloudflare recibe solicitudes normales y puede procesar información técnica necesaria para prestar el servicio. Por separado, Cloudflare Web Analytics recopila métricas del tiempo de carga; Cloudflare indica que este servicio no recopila ni utiliza datos personales de los visitantes y no registra los parámetros de consulta de las URL. El conversor Markdown muestra HTML sin procesar; los recursos remotos insertados pueden hacer que el navegador contacte con otros sitios. No previsualice marcado sensible que haga referencia a sitios externos."
      },
      {
        "title": "Cookies, analíticas y publicidad",
        "body": "Google Analytics y Microsoft Clarity se cargan como se describe arriba. El aviso solo comunica este uso; no desactiva las analíticas. Google AdSense puede usar cookies o identificadores cuando se solicitan anuncios para mostrarlos, generar informes, limitar su frecuencia y —según la configuración aplicable y las opciones elegidas— personalizarlos según visitas anteriores. Es posible que se muestren anuncios aunque no se utilicen analíticas. Consulta la Configuración de anuncios de Google para revisar los controles de anuncios personalizados."
      },
      {
        "title": "Servicios de terceros",
        "body": "Google Analytics, Microsoft Clarity, Google AdSense y Cloudflare procesan información conforme a sus propios términos y avisos de privacidad. JW Tool Box no controla sus periodos de conservación ni todos sus usos de datos."
      }
    ],
    "controls": "Para revisar las opciones publicitarias o inhabilitar los anuncios personalizados, use la Configuración de anuncios de Google. También puede utilizar la página de exclusión del sector para las empresas participantes.",
    "google_ads_settings": "Configuración de anuncios de Google",
    "industry_optout": "Opciones de exclusión del sector",
    "ad_controls_title": "Opciones de publicidad"
  },
  "not_found_page": {
    "meta_title": "Página no encontrada",
    "meta_description": "La página que busca no existe o se ha movido.",
    "eyebrow": "404",
    "title": "Página no encontrada",
    "message": "La página que busca no existe o se ha movido.",
    "go_home": "Ir al inicio",
    "view_tools": "Ver herramientas"
  },
  "tools": {
    "svgToPng": {
      "upload": "Subir SVG",
      "uploadPrompt": "Haz clic para subir archivo SVG o arrastra y suelta",
      "svgCode": "Código SVG",
      "svgPlaceholder": "Pega tu código SVG aquí…",
      "scale": "Escala",
      "convert": "Convertir a PNG",
      "preview": "Vista previa",
      "error": "Conversión fallida. Por favor verifica tu código SVG."
    },
    "barcodeGenerator": {
      "settings": "Configuración",
      "barcodeText": "Texto del código de barras",
      "textPlaceholder": "Ingresa texto o números…",
      "format": "Formato",
      "width": "Ancho",
      "height": "Alto",
      "showText": "Mostrar texto debajo del código de barras",
      "preview": "Vista previa",
      "download": "Descargar",
      "invalidInput": "Entrada inválida para el formato seleccionado",
      "useExample": "Usar ejemplo: {{example}}",
      "errors": {
        "empty": "Introduce el valor que quieres codificar.",
        "ascii": "CODE128 admite caracteres ASCII: letras latinas, números o puntuación ASCII.",
        "code39": "CODE39 admite A–Z, números, espacios y - . $ / + %.",
        "digits": "{{format}} solo admite números. Elimina espacios, letras y puntuación.",
        "length": "{{format}} necesita {{count}} dígitos sin el dígito de control o {{full}} con él.",
        "checksum": "El último dígito de control debe ser {{expected}}. Corrígelo u omítelo para calcularlo automáticamente.",
        "range": "Pharmacode debe ser un entero entre 3 y 131070.",
        "unexpected": "No se pudo codificar este valor. Revisa las reglas del formato o prueba el ejemplo."
      },
      "hints": {
        "CODE128": "Etiquetas generales: texto ASCII y números.",
        "EAN13": "12 dígitos, o 13 con el dígito de control. Si falta, se calcula automáticamente.",
        "UPC": "11 dígitos, o 12 con el dígito de control. Si falta, se calcula automáticamente.",
        "CODE39": "Letras A–Z, números, espacios y - . $ / + %. Las minúsculas se convierten a mayúsculas.",
        "ITF14": "13 dígitos, o 14 con el dígito de control. Si falta, se calcula automáticamente.",
        "MSI": "Solo números; este formato no exige una longitud fija.",
        "pharmacode": "Un número entero entre 3 y 131070."
      }
    },
    "xmlJsonConverter": {
      "input": "Entrada",
      "output": "Salida",
      "convert": "Convertir",
      "copy": "Copiar",
      "clear": "Limpiar",
      "xmlPlaceholder": "Pega tu XML aquí…",
      "jsonPlaceholder": "Pega tu JSON aquí…",
      "outputPlaceholder": "La salida convertida aparecerá aquí…",
      "emptyInput": "Por favor ingresa contenido para convertir",
      "conversionError": "Conversión fallida. Por favor verifica la sintaxis de tu entrada."
    },
    "yamlJsonConverter": {
      "input": "Entrada",
      "output": "Salida",
      "convert": "Convertir",
      "copy": "Copiar",
      "clear": "Limpiar",
      "yamlPlaceholder": "Pega tu YAML aquí…",
      "jsonPlaceholder": "Pega tu JSON aquí…",
      "outputPlaceholder": "La salida convertida aparecerá aquí…",
      "emptyInput": "Por favor ingresa contenido para convertir",
      "conversionError": "Conversión fallida. Por favor verifica la sintaxis de tu entrada."
    },
    "sqlFormatter": {
      "settings": "Configuración",
      "sqlDialect": "Dialecto SQL",
      "input": "Entrada",
      "output": "Salida",
      "format": "Formatear SQL",
      "copy": "Copiar",
      "clear": "Limpiar",
      "inputPlaceholder": "Pega tu consulta SQL aquí…",
      "outputPlaceholder": "El SQL formateado aparecerá aquí…",
      "emptyInput": "Por favor ingresa SQL para formatear",
      "formatError": "Formato fallido. Por favor verifica tu sintaxis SQL."
    }
  },
  "referrals": {
    "us_mobile": {
      "title": "Ahorra en tu factura telefónica con US Mobile",
      "description": "¡Prueba 30 días gratis! Planes de datos ilimitados desde $17.50/mes, y crea tu propio plan 5G a medida."
    },
    "vultr": {
      "title": "Despliega globalmente con Vultr",
      "description": "Infraestructura en la nube de alto rendimiento. Despliega instancias VPS, GPU y Bare Metal en segundos en más de 32 ubicaciones globales."
    }
  },
  "exif_eraser": {
    "title": "Borrador de EXIF y Metadatos",
    "description": "Elimina la ubicación GPS y los datos de cámara ocultos de tus fotos en el navegador. Las fotos no se suben a JW Tool Box; el sitio registra datos de uso como se explica en la Política de privacidad.",
    "drag_drop": "Arrastra y suelta imágenes aquí",
    "add_more": "Añadir más imágenes",
    "no_uploads": "Las fotos se procesan localmente; el sitio registra por separado datos de uso según la Política de privacidad.",
    "photos_selected": "{{count}} fotos en cola",
    "clear": "Limpiar todo",
    "clean_title": "Limpiar y Descargar",
    "clean_desc": "Copiaremos los píxeles físicos y destruiremos los metadatos ocultos.",
    "export_zip": "Exportar ZIP Limpio",
    "processing_btn": "Borrando Datos…",
    "steps": "Tus imágenes no salen de tu dispositivo. Confianza cero.",
    "msg_add_photos": "Por favor, añade algunos archivos de imagen válidos primero.",
    "msg_add_first": "La cola está vacía.",
    "msg_processing": "Borrando metadatos… Por favor espera.",
    "msg_done": "¡Se limpiaron exitosamente {{count}} imágenes!",
    "msg_failed": "Ocurrió un error durante el procesamiento."
  },
  "csv_diff": {
    "has_header": "La primera fila es de encabezados",
    "compare_by": "Comparar por",
    "entire_row": "Fila entera (Coincidencia exacta)",
    "swap_lists": "Intercambiar Listas",
    "list_a": "Lista A (Base)",
    "list_b": "Lista B (Comparar)",
    "upload_csv": "Subir CSV",
    "paste_placeholder": "Pega correos, IDs o datos CSV aquí…",
    "paste_placeholder_b": "Pega la segunda lista con la que comparar…",
    "op_intersection": "A ∩ B (En Ambos)",
    "op_intersection_desc": "Encontrar elementos comunes",
    "op_a_only": "A - B (Solo en A)",
    "op_a_only_desc": "Elimina B de A",
    "op_b_only": "B - A (Solo en B)",
    "op_b_only_desc": "Elimina A de B",
    "op_union": "A ∪ B (Unión / Deduplicar)",
    "op_union_desc": "Fusiónalos y deduplica",
    "result_title": "Resultado",
    "rows_found": "filas encontradas",
    "copied": "¡Copiado!",
    "copy": "Copiar",
    "download": "Descargar CSV",
    "result_placeholder": "El resultado aparecerá aquí…",
    "clear_a": "Vaciar lista A",
    "clear_b": "Vaciar lista B"
  },
  "password_strength": {
    "score_0": "Muy Débil",
    "score_1": "Débil",
    "score_2": "Justo",
    "score_3": "Fuerte",
    "score_4": "Muy Fuerte",
    "input_label": "Ingresa una contraseña para probar",
    "input_placeholder": "p@ssw0rd123…",
    "waiting": "Esperando entrada…",
    "entropy_label": "Entropía",
    "online_attacks": "Ataques en Línea",
    "throttled": "Inicios limitados (100 / hr)",
    "unthrottled": "Sin límites (10 / seg)",
    "offline_attacks": "Ataques Fuera de Línea",
    "slow_hash": "Hash Lento (10k / seg)",
    "fast_hash": "Minería Rápida (10B / seg)",
    "need_stronger": "¿Necesitas una contraseña más fuerte?",
    "generator_prompt": "Nuestro generador de contraseñas local puede crear contraseñas criptográficamente seguras al instante.",
    "go_to_generator": "Abrir Generador de Contraseñas",
    "show_password": "Mostrar contraseña",
    "hide_password": "Ocultar contraseña"
  },
  "cookie_consent": {
    "message": "Este sitio utiliza cookies y tecnologías similares. Consulta la Política de privacidad para conocer el tratamiento de datos y las opciones disponibles.",
    "learn_more": "Política de privacidad",
    "accept": "Entendido"
  },
  "zxcvbn": {
    "use_a_few_words__avoid_common_phrases": "Usa algunas palabras, evita frases comunes",
    "no_need_for_symbols__digits__or_uppercase_letters": "No es necesario usar símbolos, números o mayúsculas",
    "add_another_word_or_two__uncommon_words_are_better_": "Añade una o dos palabras más. Las palabras poco comunes son mejores.",
    "straight_rows_of_keys_are_easy_to_guess": "Las filas rectas de teclas son fáciles de adivinar",
    "short_keyboard_patterns_are_easy_to_guess": "Los patrones cortos de teclado son fáciles de adivinar",
    "use_a_longer_keyboard_pattern_with_more_turns": "Usa un patrón de teclado más largo con más giros",
    "repeats_like__aaa__are_easy_to_guess": "Las repeticiones como \"aaa\" son fáciles de adivinar",
    "repeats_like__abcabcabc__are_only_slightly_harder_to_guess_than__abc_": "Repeticiones como \"abcabcabc\" son solo un poco más difíciles de adivinar que \"abc\"",
    "avoid_repeated_words_and_characters": "Evita palabras y caracteres repetidos",
    "sequences_like_abc_or_6543_are_easy_to_guess": "Secuencias como abc o 6543 son fáciles de adivinar",
    "avoid_sequences": "Evita usar secuencias",
    "recent_years_are_easy_to_guess": "Los años recientes son fáciles de adivinar",
    "avoid_recent_years": "Evita usar años recientes",
    "avoid_years_that_are_associated_with_you": "Evita años que estén asociados contigo",
    "dates_are_often_easy_to_guess": "Las fechas suelen ser fáciles de adivinar",
    "avoid_dates_and_years_that_are_associated_with_you": "Evita fechas y años asociados contigo",
    "this_is_a_top_10_common_password": "Esta es una de las 10 contraseñas más comunes",
    "this_is_a_top_100_common_password": "Esta es una de las 100 contraseñas más comunes",
    "this_is_a_very_common_password": "Esta es una contraseña muy común",
    "this_is_similar_to_a_commonly_used_password": "Esto es similar a una contraseña muy utilizada",
    "a_word_by_itself_is_easy_to_guess": "Una sola palabra es fácil de adivinar",
    "names_and_surnames_by_themselves_are_easy_to_guess": "Nombres y apellidos por sí solos son fáciles de adivinar",
    "common_names_and_surnames_are_easy_to_guess": "Nombres y apellidos comunes son fáciles de adivinar",
    "capitalization_doesn_t_help_very_much": "Usar mayúsculas no ayuda mucho",
    "all_uppercase_is_almost_as_easy_to_guess_as_all_lowercase": "Todo en mayúsculas es casi tan fácil de adivinar como todo en minúsculas",
    "reversed_words_aren_t_much_harder_to_guess": "Las palabras invertidas no son mucho más difíciles de adivinar",
    "predictable_substitutions_like_____instead_of__a__don_t_help_very_much": "Sustituciones predecibles como '@' en lugar de 'a' no ayudan mucho"
  },
  "terms_page": {
    "meta_title": "Terms of Service",
    "meta_description": "Read the Terms of Service for using JW Tool Box.",
    "eyebrow": "Terms of Service",
    "title": "Terms of Service",
    "subtitle": "Última actualización: 30 de septiembre de 2026",
    "sections": [
      {
        "title": "Acceptance of Terms",
        "body": "By accessing and using JW Tool Box, you agree to be bound by these Terms of Service. If you do not agree to these terms, please do not use the website."
      },
      {
        "title": "Use of Service",
        "body": "JW Tool Box ofrece actualmente herramientas de navegador para uso personal y comercial sin exigir una cuenta ni una suscripción. Muchas herramientas procesan las entradas en su navegador; el análisis del sitio, el alojamiento y la publicidad se describen en la Política de privacidad. El sitio se financia con publicidad. No puede utilizar el servicio para fines ilegales o no autorizados."
      },
      {
        "title": "Disclaimer",
        "body": "The tools are provided 'as is' without warranty of any kind. We are not responsible for any loss of data or damages resulting from the use of this website."
      },
      {
        "title": "Intellectual Property",
        "body": "The content, design, and code of JW Tool Box are protected by copyright. You may not copy, modify, or distribute the website without permission."
      },
      {
        "title": "Changes to Terms",
        "body": "We reserve the right to modify these terms at any time. Continued use of the website after changes constitutes acceptance of the new terms."
      }
    ]
  },
  "author_page": {
    "eyebrow": "Perfil del autor",
    "credentials": "Credenciales",
    "coverage": "Áreas de cobertura",
    "read_policy": "Leer la política editorial",
    "contact_site": "Contactar con el sitio",
    "published": "Guías publicadas",
    "article_count": "{{count}} artículo{{plural}} indexado{{plural2}} actualmente",
    "browse_guides": "Ver todas las guías"
  },
  "editorial_policy_page": {
    "eyebrow": "Confianza y estándares",
    "title": "Política editorial",
    "intro": "JW Tool Box se mantiene como un producto, no como una granja de contenido masivo. Esta página explica cómo revisamos las páginas de herramientas, cómo se escriben las guías, cómo se gestionan las correcciones y cómo mantenemos el contenido financiero o de salud dentro de límites claros y defendibles.",
    "report_heading": "Cómo informar de un problema",
    "report_body": "Si detectas un error factual, un flujo de trabajo obsoleto o una afirmación engañosa, contáctanos e incluye la URL de la página, qué parece incorrecto y qué ha cambiado. Preferimos corregir o desindexar una página débil antes que dejarla publicada.",
    "contact_site": "Contactar con el sitio"
  }
}
