{
  "time": {
    "current_time_label": "Hora actual:",
    "input_label": "Entrada (Unix ms/s o fecha)",
    "input_placeholder": "1690000000 / 1690000000000 / 2026-04-22T00:00:00Z​",
    "convert": "Convertir",
    "copy_output": "Copiar salida",
    "output": "Salida",
    "err_parse_timestamp": "No se pudo analizar la marca de tiempo.",
    "err_parse_date": "No se pudo analizar la fecha cadena.",
    "copied": "Copiado."
  },
  "json_diff": {
    "intro": "Diferencia a nivel de objeto impulsada por jsondiffpatch (no una diferencia de línea simple). Las matrices admiten la detección de movimientos; delta es una estructura de parche para agregar/eliminar/actualizar campos.",
    "left_json": "JSON izquierdo",
    "right_json": "JSON derecho",
    "compute": "calcular diferencia",
    "delta_title": "Delta (formato jsondiffpatch)",
    "no_diff_comment": "// No hay diferencia (misma estructura JSON)",
    "parse_failed": "El análisis falló"
  },
  "ascii": {
    "th_dec": "Dec​",
    "th_hex": "Hex​",
    "th_char": "Carácter",
    "th_note": "Nota",
    "note_control": "Control​",
    "note_printable": "Imprimible"
  },
  "uuid": {
    "count_label": "Contar (1–200)",
    "generate_uuid_v4": "Generar UUID v4",
    "copy_all": "Copiar todo",
    "please_generate_first": "Generar primero.",
    "copied_all": "Copiar todo.",
    "output": "Salida",
    "output_placeholder": "Haga clic en generar."
  },
  "ulid": {
    "count_label": "Contar (1–100)",
    "generate": "Generar ULID",
    "copy": "Copiar",
    "placeholder": "ID de 26 caracteres ordenables por tiempo"
  },
  "nanoid": {
    "length_label": "Longitud (4–64)",
    "alphabet_hint": "Alfabeto personalizado (vacío = valor predeterminado seguro para URL nanoide)",
    "generate": "Generar",
    "copy": "Copiar"
  },
  "units": {
    "css_title": "CSS: px ↔ rem​",
    "root_px": "Tamaño de fuente raíz (px)",
    "check_line": "Verificar: {px}px ÷ {root} = {rem} rem",
    "storage_title": "Tamaño de datos",
    "iec_toggle": "Pasos IEC (1024): KiB / MiB / GiB",
    "bytes_label": "Recuento de bytes (entero)"
  },
  "color": {
    "picker": "Selector de color",
    "css": "CSS​",
    "hex": "HEX​",
    "rgb_title": "RGB (0–255)​",
    "hsl_title": "HSL​",
    "h_label": "H (°)​",
    "s_label": "S (%)​",
    "l_label": "L (%)​",
    "copy_all_formats": "Copiar todos los formatos",
    "copied_line": "Copiar línea HEX / RGB / HSL."
  },
  "contrast": {
    "fg": "Primer plano (texto)",
    "bg": "Fondo",
    "large_text_toggle": "Usar umbral de texto grande (≥18 puntos en negrita o ≥24 puntos regular)",
    "sample_text": "Muestra Aa 中文 123",
    "invalid_hex": "Usar #RRGGBB o #RGB.",
    "ratio_label": "Contraste",
    "wcag_prefix": "WCAG 2.1:​"
  },
  "url_parse": {
    "parse": "Analizar",
    "err_invalid": "URL no válida",
    "url_object_fields": "Campos de objeto URL",
    "search_params": "Consulta (searchParams)",
    "key": "Clave",
    "value": "Valor",
    "port_default": "(predeterminado)",
    "page_intro": "Utiliza <api>URL</api> y <usp>URLSearchParams</usp> nativos; sin solicitudes de red."
  },
  "punycode": {
    "unicode_label": "Dominio Unicode/etiquetas (líneas o separadas por puntos)",
    "to_punycode": "→ Punycode / ASCII​",
    "puny_label": "Punycode (xn--…)​",
    "to_unicode": "→ Unicode​",
    "fail": "Error"
  },
  "data_url": {
    "drop_label": "Archivo → URL de datos",
    "drop_title": "Elija o suelte un archivo",
    "drop_desc": "Usa FileReader.readAsDataURL; no cargado.",
    "data_url": "URL de datos",
    "copy": "Copiar",
    "decode_download": "Decodificar y descargar",
    "err_format": "Datos esperados:[mime][;base64], carga útil",
    "decode_failed": "Error de decodificación"
  },
  "mime_sniff": {
    "drop_label": "Leer el encabezado del archivo",
    "drop_title": "Elija o suelte un archivo",
    "drop_desc": "Lee los primeros 64 bytes para detectar magia; no cargado.",
    "guess_type": "Tipo adivinado",
    "first_64_hex": "Primeros 64 bytes (hexadecimales)"
  },
  "mime_types": {
    "search_ph": "Extensión de búsqueda o MIME…",
    "col_ext": "Extensión",
    "col_mime": "MIME​",
    "col_note": "Nota"
  },
  "html_format": {
    "format": "Formato",
    "minify_simple": "Minimización simple (eliminar espacios en blanco del comentario)",
    "output": "Salida",
    "copy": "Copiar",
    "fail": "Error"
  },
  "svg_format": {
    "source": "Fuente SVG",
    "validate_indent": "Validar y sangrar",
    "xml_parse_err": "Error de análisis XML; comprobar etiquetas.",
    "fail": "Error"
  },
  "markdown": {
    "render_failed": "Error al renderizar",
    "label": "Fuente de Markdown",
    "export_html": "Exportar HTML",
    "copy_md": "Copiar Markdown",
    "preview": "Vista previa en vivo"
  },
  "http_codes": {
    "search_ph": "Código de búsqueda, nombre o descripción…",
    "col_code": "Código",
    "col_name": "Nombre",
    "col_desc": "Descripción"
  },
  "ua_parse": {
    "fill_ua": "Complete este dispositivo UA",
    "hint": "Análisis de expresiones regulares ligero, no una base de datos completa del dispositivo; los rastreadores/WebViews pueden mostrarse como Otros.",
    "browser": "Navegador",
    "engine": "Motor (grueso)",
    "os": "SO",
    "mobile": "Móvil",
    "yes": "Sí",
    "no": "No​"
  },
  "keycode": {
    "instructions": "Haga clic en el área a continuación, luego presione las teclas (algunos accesos directos están bloqueados por el navegador).",
    "capture_aria": "Área de captura de claves",
    "focus_hint": "Enfoque aquí, luego presione las teclas…",
    "which_keycode": "cuál / keyCode (heredado)",
    "modifiers": "Modificadores"
  },
  "yaml_json": {
    "warning": "js-yaml ejecuta el análisis de etiquetas; no pegue archivos YAML grandes que no sean de confianza. Solo local.",
    "yaml_to_json": "YAML → JSON​",
    "json_to_yaml": "JSON → YAML​",
    "parse_failed": "El análisis falló"
  },
  "toml_json": {
    "warning": "TOML los tipos de fecha se asignan a formularios compatibles con JSON; no pegue configuraciones grandes que no sean de confianza.",
    "toml_to_json": "TOML → JSON​",
    "json_to_toml": "JSON → TOML​",
    "parse_failed": "El análisis falló"
  },
  "json_csv": {
    "json_label": "JSON (matriz de objetos)",
    "csv_label": "CSV (fila de encabezado)",
    "json_to_csv": "JSON → CSV​",
    "csv_to_json": "CSV → JSON​",
    "need_object_array": "JSON debe ser una matriz de objetos.",
    "parse_failed": "El análisis falló"
  },
  "jsonpath": {
    "expr_label": "Expresión JSONPath",
    "hint": "Desarrollado por jsonpath-plus (tipo jq en partes).",
    "query": "Consulta",
    "result_array": "Resultado (matriz)",
    "fail": "Error"
  },
  "json_to_ts": {
    "root_name": "Nombre de la interfaz raíz",
    "generate": "Generar tipos",
    "typescript": "TypeScript​",
    "fail": "Error"
  },
  "jmespath": {
    "expr_label": "Expresión JMESPath",
    "hint": "Mismo JMESPath que AWS CLI/algunos SDK; envolver literales JSON entre comillas invertidas, p.",
    "query": "Consulta",
    "result": "Resultado",
    "fail": "Error"
  },
  "sql_format": {
    "dialect": "Dialecto",
    "dialect_sql": "SQL estándar",
    "beautify": "Embellecer",
    "compress": "Comprimir",
    "output": "Salida",
    "format_failed": "Formato fallido"
  },
  "gitignore": {
    "templates": "Plantillas",
    "merge": "Fusionar",
    "placeholder": "Fusionar .gitignore",
    "copy": "Copiar"
  },
  "compress": {
    "warn": "Utiliza CompressionStream; Brotli depende del navegador. La salida es Base64 bytes.",
    "algo": "Algoritmo",
    "mode_compress": "Comprimir",
    "mode_decompress": "Descomprimir",
    "utf8_text": "Texto UTF-8",
    "run_text_compress": "Comprimir texto",
    "run_text_decompress": "Descomprimir (se espera texto UTF-8)",
    "file_label": "O archivo (bytes sin formato)",
    "file_title": "Elija archivo",
    "file_desc": "Comprimir/descomprimir binario.",
    "b64_label": "Resultado/entrada de Base64",
    "copy_b64": "Copiar Base64",
    "from_b64_compress": "Desde Base64 → comprimir",
    "from_b64_decompress": "Desde Base64 → descomprimir",
    "unsupported_algo": "Este algoritmo no es compatible; prueba Chrome/Edge o gzip/deflate.",
    "done_bytes": "Listo ({n} bytes)",
    "fail": "Error",
    "b64_invalid": "Base64 no válida"
  },
  "cron": {
    "label": "Cron (min hora día mes dow)",
    "hint": "Texto humano vía cronstrue; La expresión compleja sigue a la biblioteca.",
    "natural_language": "lenguaje natural",
    "cannot_parse": "No se pudo analizar esta expresión."
  },
  "chmod": {
    "oct_label": "Octal (por ejemplo, 644, 755)",
    "to_rwx": "→ rwx​",
    "rwx_label": "rwxrwxrwx​",
    "to_octal": "→ octal​",
    "err_oct_range": "Octal debe ser 0–777.",
    "err_rwx": "rwx debe tener 9 caracteres de r w x - (setuid simplificado)."
  },
  "cidr": {
    "label": "IPv4/CIDR",
    "calc": "Calcular",
    "err": "Error​",
    "network": "Red",
    "broadcast": "Difusión",
    "mask": "Máscara de subred",
    "first_host": "Primer host",
    "last_host": "Último host",
    "total_addrs": "Direcciones totales",
    "usable_hosts": "Hosts utilizables (/31,/32 simplificado)"
  },
  "ipv6": {
    "label": "Dirección IPv6 o CIDR",
    "parse": "Analizar",
    "err": "Error​",
    "correct_form": "Normalizado (forma correcta)",
    "canonical_form": "Expansión completa (forma canónica)",
    "prefix_len": "Longitud del prefijo",
    "subnet_start": "Inicio de subred",
    "subnet_end": "Fin de subred",
    "addr_count": "Recuento de direcciones"
  },
  "ieee754": {
    "label": "Número (decimal)",
    "need_finite": "Introduzca un número finito.",
    "float64": "Float64​",
    "float32": "Float32​",
    "hex_be": "Hexadecimal (big-endian)",
    "detail_64": "signo {sign} · exp {exp} (sesgo 1023) · frac {frac}",
    "detail_32": "signo {sign} · exp {exp} (sesgo 127) · frac {frac}"
  },
  "num_base": {
    "from_radix": "Base de origen (2–36)",
    "digits": "Dígitos",
    "convert": "Convertir",
    "common_bases": "Bases comunes",
    "parse_err": "No se pudo analizar el número entero para esta base."
  },
  "iban": {
    "label": "IBAN (espacios correctos)",
    "check": "Verificar mod 97",
    "ok": "Suma de verificación correcta (mod 97 = 1). Normalizado: {n}",
    "bad": "Error en la suma de comprobación (resto {r}). Normalizado: {n}"
  },
  "luhn": {
    "label": "Dígitos (se aceptan espacios)",
    "check": "Verificación de Luhn",
    "pass": "Pasa Luhn (mod 10)",
    "fail": "Error"
  },
  "phone": {
    "default_country": "País predeterminado (ISO 3166-1 alfa-2; usado sin +)",
    "number": "Número de teléfono",
    "parse": "Analizar",
    "unparsed": "No se pudo analizar (intente cambiar el país predeterminado).",
    "err": "Error​",
    "line_e164": "E.164: {v}​",
    "line_intl": "Internacional: {v}",
    "line_nat": "Nacional: {v}",
    "line_country": "País: {c} (predeterminado {d})",
    "line_type": "Tipo: {v}",
    "line_valid": "Válido: {v}",
    "yes": "Sí",
    "no": "No​",
    "dash": "—​"
  },
  "letter_codes": {
    "input": "Entrada (A–Z, 0–9; use / para espacio en Morse)",
    "nato": "Alfabeto OTAN",
    "morse": "Morse código",
    "braille": "Braille (A–Z, dígitos)"
  },
  "barcode": {
    "format": "Formato",
    "content": "Contenido (longitud válida/juego de caracteres por simbología)",
    "download_png": "Descargar PNG",
    "cannot_generate": "No se pudo generar"
  },
  "video_common": {
    "intro": "El núcleo de ffmpeg (~30 MB) se carga después de seleccionar un archivo multimedia. El procesamiento permanece en su navegador; no se sube nada. Máximo recomendado de {mb}MB por archivo.",
    "core_loading": "Cargando procesador de video…",
    "core_reload": "Recargar componente",
    "load_btn_loading": "Cargando…",
    "load_btn_ready": "Núcleo listo",
    "load_btn_idle": "Cargar núcleo ffmpeg",
    "media_file": "Archivo de video o audio",
    "no_file": "No hay ningún archivo seleccionado.",
    "converting": "Procesando…",
    "download": "Descargar {name}",
    "log": "Registro",
    "load_failed": "No se pudo cargar el núcleo de ffmpeg. Verifique su red e inténtelo nuevamente.",
    "load_failed_wasm": "ffmpeg-core.wasm (~32 MB) no se cargó. Intente deshabilitar el proxy/VPN o cambiar de red.",
    "ffmpeg_exit": "ffmpeg salió con el código {c}. Pruebe primero con otro formato de salida o Video Compress.",
    "convert_failed": "Error de procesamiento",
    "progress": "Alrededor del {n} %",
    "err_file_too_large": "El archivo supera el límite de {mb}MB. Recorta o comprime primero."
  },
  "video_convert": {
    "page_intro": "Convierte entre MP4, WebM, MKV, GIF, M4A, WAV y otros formatos. Algunos códecs están limitados por el núcleo wasm; si falla, prueba otro formato de salida o usa primero Compresión de video.",
    "out_ext": "Formato de salida",
    "convert_go": "Iniciar conversión"
  },
  "video_to_mp4": {
    "page_intro": "Exportar a MP4 (H.264/AAC elegido por ffmpeg). Lo mejor para compartir y reproducir en dispositivos móviles. Si falla, prueba Video Compress para volver a codificar primero."
  },
  "video_mov_to_mp4": {
    "page_intro": "Convierte QuickTime/iPhone MOV a MP4. También se aceptan otras entradas de vídeo; la salida es siempre MP4."
  },
  "video_mkv_to_mp4": {
    "page_intro": "Convierta Matroska (.mkv) a MP4 para reproductores que no admiten MKV. La salida es siempre MP4."
  },
  "video_webm_to_mp4": {
    "page_intro": "Convierta grabaciones o descargas de pantalla WebM a MP4. La salida es siempre MP4."
  },
  "video_avi_to_mp4": {
    "page_intro": "Convierta AVI heredado a MP4. La salida es siempre MP4; Es posible que los códecs muy antiguos necesiten comprimirse o volver a codificarse primero."
  },
  "video_to_webm": {
    "page_intro": "Exportar WebM (VP8/VP9 + Opus/Vorbis). Bueno para incrustaciones web; La compatibilidad con la reproducción varía según el dispositivo."
  },
  "video_to_mkv": {
    "page_intro": "Exportar contenedor MKV. Útil para archivar; MP4 suele ser mejor para compartir."
  },
  "video_trim": {
    "page_intro": "Cortar por hora de inicio/finalización en segundos. Rápido = copia de secuencia (rápida, alineada con fotogramas clave); Preciso = recodificar (cortes más lentos y ajustados).",
    "duration_label": "Duración ≈ {sec} s",
    "start_sec": "Inicio(s)",
    "end_sec": "Fin(es)",
    "mode_label": "Modo",
    "mode_copy": "Rápido (copia de secuencia)",
    "mode_encode": "Preciso (volver a codificar)",
    "trim_go": "Recortar y descargar"
  },
  "video_compress": {
    "page_intro": "Reducir el tamaño del archivo reduciendo la resolución y aumentando CRF (mayor = más pequeño, menor calidad; típico 23–32).",
    "height_label": "Altura máxima",
    "height_option": "{h}p​",
    "crf_label": "CRF (ahora {crf})",
    "crf_hint": "CRF más alto = compresión más fuerte.",
    "compress_go": "Comprimir y descargar"
  },
  "video_to_gif": {
    "page_intro": "Convertir video a GIF. Mayor FPS/ancho = archivos más grandes y ejecuciones más lentas.",
    "fps_label": "FPS​",
    "width_label": "Ancho (px)",
    "convert_go": "Crear GIF"
  },
  "video_extract_audio": {
    "page_intro": "Elimina la pista de audio del vídeo. M4A es más pequeño; WAV no está comprimido.",
    "format_label": "Formato de salida",
    "format_m4a": "M4A (AAC)​",
    "format_wav": "WAV (PCM)​",
    "format_hint": "La codificación MP3 puede no estar disponible en wasm; prefiera M4A.",
    "extract_go": "Extraiga audio"
  },
  "x509_view": {
    "intro": "Pegue PEM (con BEGIN/END) o DER Base64; Huella digital SHA-256 a través de Web Crypto, solo local.",
    "cert": "Certificado",
    "parse": "Analizar",
    "parsing": "Análisis…",
    "fingerprint": "Huella digital SHA-256 (hexadecimal)",
    "structured": "Información estructurada",
    "parse_failed": "El análisis falló"
  },
  "jwt": {
    "warning": "Decodifica URL Base64 y formatea JSON únicamente. <strong>La firma no está verificada</strong>, no para decisiones de autenticación. No pegue tokens confidenciales en entornos que no sean de confianza.",
    "input_label": "Cadena JWT",
    "decode": "Decodificar",
    "err_empty": "Ingrese un JWT.",
    "err_parts": "Necesita al menos header.payload.",
    "err_header_json": "El encabezado no es JSON válido.",
    "err_payload_json": "La carga útil no es JSON válido."
  },
  "base64": {
    "text_label": "Texto",
    "text_to_base64": "Texto → Base64",
    "base64_to_text": "Base64 → Texto",
    "base64_field": "Base64​",
    "base64_from_file": "Base64 del archivo",
    "select_or_drop_file": "Seleccione o suelte el archivo",
    "base64_from_file_desc": "Bytes sin procesar codificados; no subido.",
    "url_safe": "URL segura (Base64URL)",
    "data_url": "Salida como URL de datos",
    "encoded_file": "Codificado: {name}",
    "copy": "Copiar",
    "copied": "Copiado.",
    "base64_to_download": "Decodificar para descargar",
    "decode_failed": "Error de decodificación"
  },
  "base32": {
    "original_utf8": "Originales (UTF-8)",
    "text_to_base32": "Texto → Base32",
    "base32_to_text": "Base32 → Texto",
    "base32_rfc4648": "Base32 (RFC 4648, sin relleno)",
    "copy": "Copiar",
    "copied_base32": "Copiado Base32.",
    "decode_failed": "Error de decodificación"
  },
  "base58": {
    "text_utf8": "Texto (UTF-8)",
    "text_to_base58": "Texto → Base58",
    "base58_to_text": "Base58 → Texto",
    "base58_field": "Base58​",
    "decode_failed": "Error de decodificación"
  },
  "url_encode": {
    "input": "Entrada",
    "output": "Salida",
    "encode": "Codificación",
    "decode": "Decodificar",
    "copy_output": "Copiar salida",
    "copied": "Copiado.",
    "decode_failed": "Error de decodificación"
  },
  "hex": {
    "text_utf8": "Texto (UTF-8)",
    "text_to_hex": "Texto → Hexadecimal",
    "hex_to_text": "Hex → Texto",
    "hex_field": "Hex (los espacios, las nuevas líneas y 0x se eliminan al decodificar)",
    "copy": "Copiar",
    "copied_hex": "Hexadecimal copiado.",
    "err_hex_odd_length": "La longitud hexadecimal debe ser par (los espacios en blanco y 0x se ignoran).",
    "err_utf8_decode": "No se pudo decodificar como UTF-8"
  },
  "escape": {
    "mode": "Modo",
    "html_entity_mode": "Entidades HTML",
    "json_string_mode": "Escape de cadena JSON",
    "input": "Entrada",
    "encode_or_escape": "Codificar/escape",
    "decode_or_restore": "Decodificar/restaurar",
    "json_decode_not_string": "El valor JSON no es una cadena.",
    "decode_failed": "Error de decodificación",
    "output": "Salida",
    "copied_output": "Salida copiada.",
    "copy_output": "Copiar salida",
    "failed": "Error",
    "page_intro": "Al igual que las herramientas comunes de escape/entidad: HTML utiliza entidades de caracteres centrales; El modo JSON escapa de cadenas analizables por <jp>JSON.parse</jp>."
  },
  "hash": {
    "select_file": "Seleccionar archivo",
    "select_or_drop_file": "Seleccione o suelte el archivo",
    "hash_local_desc": "Resumen calculado localmente; no subido.",
    "please_select_file": "Primero seleccione un archivo.",
    "computing": "Computación…",
    "compute_digest": "computar resumen",
    "copy": "Copiar",
    "computed_file": "Calculado: {name} ({size} bytes)",
    "compute_failed": "Error de cálculo",
    "md5_label": "MD5​",
    "sha256_label": "SHA-256​",
    "dash": "—​"
  },
  "hmac": {
    "hash_algorithm": "Algoritmo hash",
    "secret_key": "Clave secreta",
    "message": "Mensaje",
    "compute_hmac_hex": "Calcular HMAC (hexadecimal)",
    "output": "Salida",
    "copy": "Copiar",
    "failed": "Error",
    "dash": "—​"
  },
  "aes": {
    "aes_pbkdf2_note": "AES-256-GCM: sal aleatoria + PBKDF2 ({iter} iteraciones, SHA-256) deriva la clave solo en su navegador.",
    "passphrase": "Frase de contraseña",
    "plaintext": "Texto sin formato",
    "encrypt": "Cifrar",
    "decrypt": "Descifrar",
    "processing": "Procesando…",
    "please_input_passphrase": "Ingrese un frase de contraseña.",
    "encrypt_success": "Cifrado.",
    "encrypt_failed": "Error de cifrado",
    "cipher_base64": "Texto cifrado (Base64: salt ∥ IV ∥ datos)",
    "cipher_too_short": "El texto cifrado es demasiado corto o está dañado.",
    "decrypt_success": "Descifrado.",
    "decrypt_failed_bad_key": "Error de descifrado (frase de contraseña incorrecta o datos incorrectos).",
    "copied_cipher": "Texto cifrado copiado.",
    "copy_cipher": "Copiar texto cifrado"
  },
  "password": {
    "select_charset": "Seleccione al menos un conjunto de caracteres.",
    "length_4_to_256": "Longitud (4–256)",
    "upper_az": "Mayúsculas A–Z",
    "lower_az": "minúsculas a–z",
    "digits": "Dígitos",
    "symbols": "símbolos",
    "generate": "Generar",
    "copy": "Copiar",
    "copied": "Copiado.",
    "result": "Resultado",
    "placeholder_click_generate": "Haga clic en Generar",
    "footnote": "Utiliza crypto.getRandomValues; El conjunto de símbolos es un pequeño subconjunto compatible con el teclado: ajuste las casillas de verificación según sea necesario."
  },
  "crc32": {
    "text_utf8": "Texto (UTF-8)",
    "compute_crc32": "Calcular CRC32",
    "label_from_file": "O desde el archivo",
    "title_drop": "Seleccione o suelte el archivo",
    "desc_local": "IEEE CRC-32 sobre bytes sin formato; no subido.",
    "crc32_title": "CRC32​",
    "label_current_text": "texto actual",
    "copy_hex": "Copiar hexadecimal",
    "copied_hex_value": "Valor hexadecimal copiado.",
    "msg_computed": "Calculado: {label} ({bytes} bytes)",
    "read_failed": "Error de lectura",
    "decode_failed": "Error",
    "dash": "—​"
  },
  "xor": {
    "warning": "XOR es simétrico y no ofrece autenticación; no lo utilice para un verdadero secreto; está bien para CTF, demostraciones u ofuscación ligera.",
    "encrypt_section": "Cifrar",
    "decrypt_section": "Descifrar",
    "plaintext_utf8": "Texto sin formato (UTF-8)",
    "key_utf8_cyclic": "Clave (UTF-8, repetida)",
    "output_format": "Formato de salida",
    "opt_hex": "Maleficio",
    "opt_b64": "Base64​",
    "xor_to_cipher": "XOR → texto cifrado",
    "cipher_label": "Texto cifrado",
    "cipher_input_label": "Texto cifrado ({mode})",
    "xor_to_plain": "XOR → texto sin formato",
    "plaintext_result": "Texto sin formato",
    "err_key_empty": "La clave no puede estar vacía",
    "err_hex_odd": "La longitud del hexágono debe ser uniforme.",
    "failed": "Error"
  },
  "vigenere": {
    "intro": "Vigenère: sólo se transforman A–Z / a–z; Se mantienen otros personajes. Se ignoran las letras que no son letras en la clave.",
    "text": "Texto",
    "key_english": "Clave (letras)",
    "encrypt": "Cifrar",
    "decrypt": "Descifrar",
    "result": "Resultado",
    "err_key_letters": "La clave debe contener al menos una letra de la A a la Z",
    "error_generic": "Error​"
  },
  "rsa": {
    "intro": "Utiliza el navegador <link>Web Crypto</link> RSA-OAEP; solo para mensajes cortos o envolver claves simétricas. Requiere un contexto seguro (HTTPS o localhost).",
    "generate_keypair": "Generar par de claves",
    "pub_pem": "Clave pública (SPKI PEM)",
    "priv_pem": "Clave privada (PKCS#8 PEM)",
    "encrypt_section": "Cifrar",
    "plaintext_utf8": "Texto sin formato (UTF-8)",
    "encrypt_public": "Cifrar con clave pública",
    "cipher_section": "Cifrar texto y descifrar",
    "cipher_b64": "Texto cifrado (Base64)",
    "decrypt_private": "Descifrar con clave privada",
    "decrypted": "Descifrado",
    "msg_generated": "RSA-OAEP de 2048 bits generado (SHA-256); La clave privada permanece sólo en la memoria; no la comparta.",
    "msg_generate_fail": "Error al generar (algunos entornos necesitan un contexto seguro: HTTPS o localhost).",
    "err_need_public_pem": "Primero genere o pegue la clave pública PEM.",
    "err_plain_too_long": "Texto sin formato demasiado largo: RSA-OAEP (2048/SHA-256) suele tener menos de {max} bytes; actual {current}. Utilice criptografía simétrica (por ejemplo, AES-256-GCM) para encapsular claves.",
    "encrypt_failed": "Error de cifrado",
    "err_need_private_pem": "Primero genere o pegue la clave privada PEM.",
    "decrypt_failed": "Error al descifrar",
    "err_pem_parse": "No se pudo analizar PEM; marque los bloques COMIENZO/FIN."
  },
  "qr_generate": {
    "content_label": "Contenido (texto / URL / Wi‑Fi)",
    "size_px": "Tamaño (px)",
    "margin": "Margen",
    "foreground": "Primer plano",
    "background": "Fondo",
    "generate_preview": "Generar vista previa",
    "busy": "Generando…",
    "download_png": "Descargar PNG",
    "preview": "Vista previa",
    "qr_alt": "Código QR",
    "err_empty": "El contenido no puede estar vacío",
    "err_generate": "Error al generar",
    "error_correction": "Corrección de errores",
    "low_contrast": "El contraste del primer plano y del fondo es bajo; Es posible que algunos escáneres no reconozcan el código.",
    "live_preview": "Vista previa en vivo",
    "templates": "Plantillas",
    "template_url": "URL​",
    "template_wifi": "Wi-Fi",
    "template_email": "Correo electrónico",
    "template_tel": "Teléfono",
    "scan_hint": "Carga útil actual: {length} caracteres. El contenido más corto escanea de manera más confiable."
  },
  "qr_decode": {
    "drop_label": "Imagen con código QR",
    "drop_title": "Seleccione o suelte PNG/JPG…",
    "drop_desc": "Decodificado localmente con jsQR; no subido.",
    "empty_hint": "Aún no se ha seleccionado ninguna imagen.",
    "parse_result": "Resultado",
    "copy": "Copiar",
    "err_canvas": "Lienzo no disponible",
    "err_not_found": "No se encontró QR (pruebe con una imagen más clara y de mayor contraste).",
    "err_decode": "Error de decodificación",
    "err_load_image": "No se pudo cargar la imagen",
    "dash": "—​"
  },
  "text_case": {
    "mode_label": "Transformar",
    "mode_upper": "MAYÚSCULAS",
    "mode_lower": "minúsculas",
    "mode_title": "Título (palabras)",
    "mode_sentence": "Oración (heurística)",
    "mode_camel": "camelCase​",
    "mode_constant": "CONSTANT_CASE​",
    "mode_kebab": "kebab-case​",
    "mode_snake": "Snake_case",
    "source": "Fuente",
    "result": "Resultado",
    "copy_result": "Copiar resultado",
    "placeholder_source": "Pegar o escribir…"
  },
  "text_lines": {
    "sort_asc": "Ordenar líneas ( ↑)",
    "sort_desc": "Ordenar líneas (↓)",
    "dedupe": "Deduplicar líneas",
    "remove_empty": "Eliminar líneas vacías",
    "trim_lines": "Recortar cada línea",
    "reverse": "Invertir el orden de las líneas",
    "input": "Entrada",
    "result": "Resultado",
    "copy_result": "Copiar resultado",
    "placeholder_input": "Un elemento por línea, o pegar una lista…",
    "placeholder_result": "Utilice los botones de arriba…"
  },
  "text_stats": {
    "label": "Texto",
    "placeholder": "Pegar contenido; las estadísticas se actualizan en vivo...",
    "lines": "Líneas",
    "chars_code_units": "Caracteres (unidades de código)",
    "chars_no_ws": "Caracteres (sin espacios en blanco)",
    "words_ws": "Palabras (división de espacios en blanco)",
    "graphemes": "Grupos de grafemas (Intl, aprox. “caracteres”)",
    "bytes_utf8": "bytes UTF-8",
    "footnote": "“Palabras” divididas en espacios; para CJK, etc. prefieren grafemas. Todas las estadísticas se ejecutan localmente."
  },
  "text_replace": {
    "find": "Buscar",
    "replace_with": "Reemplazar con",
    "use_regex": "Usar expresión regular",
    "flags": "Banderas",
    "source": "Fuente",
    "result": "Resultado",
    "copy": "Copiar",
    "footnote": "El modo literal reemplaza todas las coincidencias globalmente; El modo regex sigue a String.replace: escape mental y banderas (comunes: g, i, m)."
  },
  "text_split_join": {
    "delimiter": "Delimitador",
    "placeholder_delimiter": "p.ej. , o | o personalizado",
    "split_lines": "Dividir → un elemento por línea",
    "join_lines": "Unir ← líneas con delimitador",
    "copy_result": "Copiar resultado",
    "help": "Dividir: corta el texto por delimitador en líneas. Unir: leer la entrada línea por línea e insertar el delimitador entre líneas.",
    "placeholder_input": "Dividir: pegar una línea separada por comas; Unirse: un elemento por línea...",
    "placeholder_output": "Haga clic en dividir o unir...",
    "input": "Entrada",
    "output": "Salida"
  },
  "text_regex": {
    "warn_truncated": "Solo los primeros {max} caracteres coinciden y se resaltan.",
    "pattern": "Patrón",
    "flags": "Banderas",
    "flags_ph": "gimsuy​",
    "invalid": "Expresión regular no válida",
    "text": "Texto",
    "match_count": "{count} coincidencia(s)",
    "list_omitted": "… se omiten más coincidencias"
  },
  "text_diff": {
    "text_a": "Texto A",
    "text_b": "Texto B",
    "line_diff": "Diferencia de línea"
  },
  "text_lorem": {
    "paragraphs": "Párrafos (1–50)",
    "generate": "Generar",
    "copy": "Copiar",
    "placeholder": "Haga clic en Generar"
  },
  "text_rot13": {
    "label": "Texto (A–Z gira 13; ejecútelo nuevamente para deshacer)",
    "action": "ROT13​"
  },
  "text_strip_html": {
    "warning": "Utiliza DOMParser para nodos de texto; los scripts no se ejecutan; aun así, evite pegar HTML de gran tamaño que no sea de confianza.",
    "html": "HTML​",
    "plain": "Texto sin formato",
    "extract": "Extraer texto sin formato",
    "placeholder_out": "Utilice el botón de la izquierda"
  },
  "text_slug": {
    "input": "Entrada",
    "generate": "Generar slug",
    "hint": "Eliminar signos diacríticos, mantener a–z y 0–9, convertir espacios/símbolos en guiones (ayudante de slug de URL, no SEO completo).",
    "result": "Resultado",
    "copy": "Copiar",
    "dash": "—​"
  },
  "text_indent": {
    "text": "Texto",
    "use_tab": "Sangría con tabulación",
    "spaces_per_level": "Espacios por nivel",
    "dedent_times": "Pasadas de sangría",
    "indent_once": "Sangría de bloque completo",
    "dedent_tab": "Eliminar hasta {n} tabulaciones iniciales por línea",
    "dedent_space": "Eliminar hasta {n} espacios iniciales por línea",
    "skip_blank": "Saltar líneas en blanco",
    "copy": "Copiar resultado",
    "example": "Ejemplo",
    "clear": "Borrar",
    "copied": "Copiado al portapapeles."
  },
  "text_sort_lines": {
    "label": "Ordenar líneas",
    "desc": "Descendente",
    "natural": "Clasificación natural (numérica)",
    "trim_end": "Recortar el final de la línea antes de ordenar",
    "sort": "Ordenar",
    "page_intro": "Clasificación de complementos en la limpieza de líneas: alternar ascendente/descendente y habilitar el modo numérico compatible con <lc>localeCompare</lc>, excelente para números de versión y listas de archivos."
  },
  "text_line_numbers": {
    "text": "Texto",
    "start": "Número de inicio",
    "pad_width": "Ancho mínimo",
    "separator": "Separador",
    "add": "Agregar línea números",
    "strip": "Quitar el prefijo simple “número | ”",
    "footnote": "Strip utiliza una expresión regular simple para los dígitos iniciales y “|”; edítelo manualmente para casos complejos."
  },
  "text_wrap": {
    "note": "El ancho cuenta unidades de código UTF-16, no columnas terminales ni CJK de ancho completo; alternar división completa para líneas largas e ininterrumpidas.",
    "text": "Texto",
    "max_width": "Máximo de caracteres por línea",
    "break_long": "División de líneas largas sin espacios",
    "rewrap": "Reenvolver en su lugar"
  },
  "csv_markdown": {
    "csv_to_md": "CSV → Markdown​",
    "to_markdown": "A tabla de Markdown",
    "md_to_csv": "Tabla de Markdown → CSV",
    "to_csv": "A CSV",
    "failed": "Error"
  },
  "fullwidth": {
    "source": "Texto",
    "to_full": "A ancho completo",
    "to_half": "A ancho medio",
    "footnote": "Cubre ASCII imprimible y espacio; CJK, etc. sin cambios."
  },
  "rmb_daxie": {
    "convert": "Convertir",
    "placeholder": "1234.56​",
    "error": "Error​"
  },
  "ics": {
    "raw_label": "Texto de iCalendar",
    "parse": "Analizar",
    "no_events": "Sin VEVENT analizado",
    "parse_failed": "El análisis falló",
    "no_title": "(Sin título)",
    "start": "Inicio",
    "end": "Fin",
    "location": "Ubicación",
    "dash": "—​"
  },
  "vcard": {
    "raw_label": "Texto de vCard",
    "th_field": "Campo",
    "th_value": "Valor",
    "empty": "No hay filas válidas"
  },
  "email_headers": {
    "raw_label": "Encabezados sin formato (hasta la primera línea en blanco)",
    "th_name": "Nombre",
    "th_value": "Valor",
    "empty": "Nada analizado"
  },
  "docmind": {
    "privacy_title": "Aviso de conversión en la nube",
    "privacy_body": "Los archivos se envían a través del convertidor de este sitio a Alibaba Cloud Document Mind (China continental). No cargue datos personales sensibles. Los enlaces de descarga de Alibaba suelen ser válidos durante aproximadamente 24 horas.",
    "err_no_file": "Elija primero un archivo PDF.",
    "err_file_too_large": "El archivo no debe exceder los {max}MB.",
    "err_too_many_files": "Solo un archivo PDF por conversión.",
    "err_failed": "La conversión falló",
    "err_no_download_url": "La conversión finalizó pero no se devolvió ninguna URL de descarga. Inténtelo de nuevo.",
    "err_proxy_unreachable": "No se puede acceder al servicio de conversión ({base}). Inicie el proxy docmind y configure NEXT_PUBLIC_DOCMIND_API_URL.",
    "msg_submitting": "Enviando trabajo de conversión…",
    "msg_processing": "Procesando en la nube; esto puede tardar desde decenas de segundos hasta unos pocos minutos... ",
    "msg_done": "Conversión completa. Descargue de la lista siguiente.",
    "result_title": "Resultados de la conversión",
    "download_hint": "Los enlaces los proporciona Alibaba Cloud y suelen ser válidos durante unas 24 horas. Si el guardado falla, abra el enlace en una nueva pestaña.",
    "selected_file": "Seleccionado: {name} (~{size} MB)",
    "poll_hint": "Encuestado {count} veces, comprobando aproximadamente cada 10 segundos",
    "limits_note": "Límites: un PDF por trabajo, máximo 5 MB, máximo 10 páginas"
  },
  "pdf_to_word": {
    "drop_label": "Elija PDF",
    "drop_desc": "Un PDF por trabajo, máximo 5 MB; se convierte a Word (.docx) a través de Alibaba Document Mind.",
    "empty_hint": "Ningún archivo seleccionado todavía.",
    "btn_convert": "Convertir",
    "before_title": "Verifique el ajuste de conversión antes de cargar",
    "before_body": "PDF a Word sube el archivo a un servicio de inteligencia documental para reconocer el diseño. Funciona mejor con contratos, informes, documentos de oficina y escaneos claros editables. Confirma tus reglas de cumplimiento antes de subir archivos sensibles.",
    "good_for": "Bueno para",
    "good_contract": "Contratos, avisos, manuales y documentos que necesitan edición",
    "good_report": "Informes con títulos, párrafos, imágenes y tablas sencillas.",
    "good_scan": "Borre archivos PDF escaneados o archivos PDF de fotografías que necesitan OCR",
    "not_for": "No es ideal para",
    "not_sensitive": "identificaciones, tarjetas bancarias, contratos confidenciales o archivos que no deben cargarse",
    "not_large": "PDF de más de 5 MB o demasiadas páginas",
    "not_table": "PDF con muchas tablas; use PDF a Excel en su lugar",
    "fail_title": "¿Error o mala calidad?",
    "try_compress": "Comprimir primero",
    "try_split": "Dividir primero",
    "try_excel": "A Excel"
  },
  "pdf_to_excel": {
    "drop_label": "Elija PDF",
    "drop_desc": "Un PDF por trabajo, máximo 5 MB; se convierte a Excel (.xlsx) a través de Alibaba Document Mind.",
    "empty_hint": "Ningún archivo seleccionado todavía.",
    "btn_convert": "Convertir"
  },
  "pdf_merge": {
    "drop_label": "Elija archivos PDF (combinados en orden de lista; agregue varias veces)",
    "drop_desc": "Se admite selección múltiple; el orden sigue la lista a continuación; arrastre nuevamente para agregar.",
    "err_need_two": "Seleccione al menos 2 archivos PDF.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "Falló la fusión",
    "empty_hint": "Aún no hay archivos seleccionados.",
    "btn_merge_download": "Fusionar y descargar",
    "download_name": "merged.pdf​",
    "move_up": "Subir",
    "move_down": "Bajar"
  },
  "pdf_batch": {
    "phase2_title": "Fase 2: cola por lotes + renderizado de Worker (cuando sea compatible)",
    "phase2_body": "Si se admite OffscreenCanvas, la rasterización se ejecuta en un Worker para reducir los bloqueos de la interfaz de usuario; de lo contrario, vuelve al hilo principal con fragmentación.",
    "drop_label": "Agregue archivos PDF a la cola (selección múltiple, arrastre varias veces)",
    "drop_desc": "Los archivos que no son PDF se filtran. Las tareas aparecen en la lista a continuación.",
    "err_no_pdf": "No se detectaron archivos PDF.",
    "err_no_pending": "No hay tareas pendientes (los elementos completados no se reexportan).",
    "log_started": "Iniciando exportación por lotes…",
    "err_cancelled": "Cancelado",
    "err_failed_msg": "Error en el lote",
    "log_done_zip": "Descarga ZIP empaquetada finalizada.",
    "scale_label": "Escala de exportación (el lote sugiere 1.4 – 2.2)",
    "fmt_label": "Formato de exportación",
    "quality_label": "Calidad (0.1 – 1.0)",
    "status_prefix": "Estado:",
    "status_pending": "pendiente",
    "status_running": "en ejecución",
    "status_done": "hecho",
    "status_error": "error​",
    "btn_remove": "Eliminar",
    "queue_empty": "La cola está vacía.",
    "btn_export_all": "Exportar todo ({n} pendiente)",
    "btn_processing": "Laboral…",
    "btn_cancel": "Cancelar",
    "btn_clear_queue": "Limpiar cola",
    "log_page_progress": "{file}: {current}/{total}​"
  },
  "pdf_compress": {
    "notice_title": "Estrategia de compresión (transparente)",
    "notice_body": "Compresión ráster: cada página se procesa en JPG y se reconstruye en un PDF. Funciona mejor en escaneos; Los archivos PDF de texto pueden crecer o verse más suaves.",
    "drop_label": "Elija PDF",
    "drop_desc": "Vuelva a empaquetar localmente en el navegador para reducir el tamaño; no se sube nada.",
    "compress_desc": "Reempaquetado de transmisión local para reducir el tamaño; no cargado.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "download_name": "comprimido.pdf",
    "scale_label": "Escala de renderizado (más alta = más nítida pero más grande)",
    "quality_label": "Calidad JPG (0.1 – 1.0)",
    "btn_compress": "Iniciar compresión",
    "msg_select_first": "Elija un PDF primero.",
    "msg_done_hint": "Descarga finalizada (nota: los escaneos se reducen más que los archivos PDF de texto).",
    "err_failed": "Error de compresión",
    "preset": "Preajuste de compresión",
    "preset_strong": "Fuerte (más pequeño, menor claridad)",
    "preset_balanced": "Equilibrado (recomendado)",
    "preset_quality": "Alta calidad (archivo más grande)",
    "before": "Antes",
    "after": "Después",
    "change": "Cambio de tamaño",
    "smaller": "Compresión completa. Verifique la claridad antes de descargar.",
    "larger": "El resultado es más grande que el original. Conserve el original o pruebe con un ajuste preestablecido más potente.",
    "preset_card_strong": "El archivo más pequeño",
    "preset_card_strong_desc": "Ideal para escaneos, fotografías en PDF y uso compartido de solo lectura.",
    "preset_card_balanced": "Equilibrado",
    "preset_card_balanced_desc": "Buen valor predeterminado para la mayoría de los archivos adjuntos.",
    "preset_card_quality": "Alta calidad",
    "preset_card_quality_desc": "Mejor para texto pequeño, gráficos o impresiones.",
    "raster_warning": "Nota: esta herramienta rasteriza páginas y reconstruye el PDF. Es posible que el texto ya no se pueda seleccionar después de la compresión. Utilice PDF a Word o extraiga texto si necesita contenido editable.",
    "saved": "Guardado",
    "output_size": "Tamaño de salida",
    "check_quality": "Abra el resultado y verifique la claridad del texto/imagen",
    "next_actions": "Continuar después de la compresión",
    "next_split": "Dividir páginas",
    "next_merge": "Fusionar PDF",
    "next_images": "Convertir a imágenes"
  },
  "pdf_crop": {
    "intro": "Ajustar los márgenes de CropBox/MediaBox (pt). Esto cambia la región visible y los límites de la página sin eliminar el contenido vectorial.",
    "drop_label": "Elija PDF",
    "drop_desc": "El recorte se ejecuta localmente. Las páginas se configuran a continuación.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "left": "Margen izquierdo (pt)",
    "right": "Margen derecho (pt)",
    "top": "Margen superior (pt)",
    "bottom": "Margen inferior (pt)",
    "mode_label": "Modo de recorte",
    "mode_crop_media": "CropBox + MediaBox (más general)",
    "mode_crop_only": "Solo CropBox (conservador)",
    "btn_crop": "Recortar y descargar",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_pick_pages": "Seleccione páginas para recortar.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "Recorte fallido",
    "download_name": "cropped.pdf​"
  },
  "pdf_decrypt": {
    "notice_title": "Aviso de cumplimiento",
    "notice_body": "Solo para archivos PDF cuya contraseña conoce. Las páginas se rasterizan y se reconstruyen, por lo que se pierden el texto y los enlaces seleccionables.",
    "drop_encrypt_label": "Elija PDF cifrado",
    "drop_desc": "Descifre localmente con su contraseña; los archivos no se cargan.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "password_label": "Abra la contraseña",
    "scale_label": "Renderizar escala",
    "quality_label": "Calidad JPG (0.1 – 1.0)",
    "btn_decrypt": "Descifrar y descargar",
    "msg_select_first": "Elija un PDF primero.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "Error al descifrar",
    "download_name": "decrypted.pdf​"
  },
  "pdf_delete_pages": {
    "drop_label": "Elija PDF",
    "drop_desc": "Haga clic en las miniaturas para eliminarlas; las páginas no seleccionadas permanecen y se exportan a un archivo nuevo.",
    "hint_short": "Haga clic en las páginas para eliminarlas; las páginas no seleccionadas permanecen en el PDF exportado.",
    "btn_delete": "Elimine las páginas seleccionadas y descárguelas",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_pick_delete": "Seleccione las páginas para eliminar.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "Eliminación fallida",
    "thumb_title": "Páginas para eliminar",
    "download_name": "páginas-eliminadas.pdf"
  },
  "pdf_extract_text": {
    "drop_label": "Elija PDF",
    "drop_desc": "Extraiga texto por página localmente; Es posible que los escaneos no tengan capa de texto.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "btn_extract": "Extraer texto (txt)",
    "msg_select_pdf": "Elija un PDF primero.",
    "progress_page": "Extrayendo página {current}/{total}…",
    "msg_done_hint": "Texto exportado. Nota: Es posible que los archivos PDF escaneados o con imágenes no contengan texto.",
    "err_failed": "Error de extracción"
  },
  "pdf_header_footer": {
    "intro": "Fase 2: plantillas de encabezado y pie de página izquierda/centro/derecha; Los marcadores de posición '{'n'}' y '{'total'}' se reemplazan en la exportación. El texto chino utiliza el subconjunto Source Han Sans de OSS; Los fallos de recuperación retroceden con gracia.",
    "presets_heading": "Preajustes rápidos",
    "drop_label": "Elija PDF",
    "drop_desc": "Aplicar texto de encabezado/pie de página por página localmente; admite '{'n'}' / '{'total'}', etc.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "header_left": "Cabecera izquierda",
    "header_center": "Centro de encabezado",
    "header_right": "Encabezado derecho",
    "footer_left": "Pie de página a la izquierda",
    "footer_center": "Centro de pie de página",
    "footer_right": "Pie de página derecho",
    "ph_company": "p.ej. nombre de empresa",
    "ph_title": "p.ej. título del documento",
    "ph_version": "p.ej. versión",
    "footer_center_ph": "Sugerido: '{'n'}' / '{'total'}'",
    "font_size": "Tamaño de fuente",
    "margin_pt": "Margen (pt)",
    "btn_apply": "Aplicar y descargar",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_need_field": "Llene al menos un espacio de encabezado o pie de página.",
    "msg_pick_pages": "Seleccione páginas para la plantilla.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "Error",
    "preset_minimal_name": "Pie de página mínimo (n/total)",
    "preset_internal_name": "Uso interno + pie de página",
    "preset_dual_name": "Encabezado doble + pie de página centrado",
    "preset_internal_header": "Interno · No distribuir",
    "preset_internal_footer": "Página '{'n'}' / '{'total'}' páginas",
    "preset_dual_footer": "Confidencial",
    "download_name": "encabezado-pie de página.pdf"
  },
  "images_to_pdf": {
    "intro": "PNG / JPEG compatible. Una imagen por página PDF; el tamaño de la página coincide con las dimensiones en píxeles.",
    "drop_label": "Elija imágenes (el orden de las páginas sigue la lista; agregue varias veces)",
    "drop_desc": "Solo PNG y JPEG; El orden de la lista es el orden de las páginas.",
    "empty_hint": "Aún no hay archivos seleccionados.",
    "btn_generate": "Crear PDF",
    "msg_need_image": "Elija al menos una imagen.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "No se pudo generar",
    "download_name": "imagenes-fusionadas.pdf"
  },
  "pdf_metadata": {
    "drop_label": "Elija PDF",
    "drop_desc": "Leer propiedades comunes de documentos; editar y exportar como un archivo nuevo.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "label_title": "Título",
    "label_author": "Autor",
    "label_subject": "Sujeto",
    "label_keywords": "Palabras clave",
    "keywords_ph": "Separar con comas",
    "label_creator": "Creador",
    "label_producer": "Productor (opcional)",
    "producer_ph": "Déjelo vacío para mantener el Productor existente",
    "label_language": "Idioma (opcional)",
    "language_ph": "p.ej. zh-CN, en-US; dejar vacío para omitir Lang en el esquema",
    "checkbox_viewer_prefs": "Prefiere el título del documento en el título de la ventana del visor (pdf-lib ViewerPreferences)",
    "btn_apply": "Aplicar y descargar",
    "msg_loaded": "Metadatos cargados; editar y exportar.",
    "msg_read_failed": "Error de lectura",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_done_verify": "Metadatos escritos y descargados (algunos visores guardan en caché los metadatos antiguos; cambie el nombre para verificar).",
    "err_export_failed": "Exportación fallida",
    "download_suffix": "-metadatos",
    "page_intro": "Cubre los campos comunes que se muestran en las \"propiedades del documento\" del lector. Los cambios escriben un nuevo archivo localmente; no se carga nada en nuestros servidores. Desarrollado por <pdflib>Hopding/pdf-lib</pdflib>."
  },
  "pdf_page_numbers": {
    "intro": "Marcadores de posición: '{'n'}' página actual, '{'total'}' páginas totales. Las cadenas chinas están bien (por ejemplo, “Página '{'n'}'”); la fuente se carga desde el subconjunto OSS con respaldo.",
    "drop_label": "Elija PDF",
    "drop_desc": "Agregue numeración de pie de página/borde de página localmente.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "start_number": "Número de inicio",
    "align_label": "Alineación",
    "align_left": "Izquierda",
    "align_center": "Centro",
    "align_right": "Derecha",
    "format_string": "Cadena de formato",
    "font_size": "Tamaño de fuente",
    "margin_x": "Margen horizontal (pt)",
    "margin_y_footer": "Elevación de pie de página (pt, más grande = más arriba en la página)",
    "btn_add": "Agregar números de página y descargar",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_pick_pages": "Seleccionar páginas para numerar.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "Error",
    "download_name": "page-numbers.pdf​"
  },
  "pdf_reverse": {
    "drop_label": "Elija PDF",
    "drop_desc": "Invertir todo el orden de las páginas; contenido sin cambios.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "btn_reverse": "Orden inverso y descarga",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_done": "Descarga lista.",
    "err_failed": "Error de procesamiento",
    "download_suffix": "-invertido",
    "page_intro": "Útil cuando el orden de encuadernación o lectura necesita el PDF completo volteado de un extremo a otro; implementado a través de la copia de páginas <pdflib>pdf-lib</pdflib> sin volver a renderizar contenidos vectoriales."
  },
  "pdf_rotate": {
    "drop_label": "Elija PDF",
    "drop_desc": "Seleccione miniaturas y luego agregue rotación relativa por página seleccionada; procesado localmente.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "angle_label": "Rotación a aplicar (relativa)",
    "btn_rotate": "Aplicar rotación",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_pick_page": "Seleccione al menos una página.",
    "msg_rotate_done": "Rotación completa. Puede descargar ahora.",
    "msg_download_done": "Descarga iniciada.",
    "err_failed": "Error en la rotación",
    "thumb_title": "Páginas para rotar",
    "thumb_preview_hint": "Las vistas previas son solo miniaturas; la calidad de la exportación no se ve afectada.",
    "download_name": "rotated.pdf​"
  },
  "pdf_split": {
    "drop_label": "Elija PDF",
    "drop_desc": "Dividir en varios archivos PDF por cada página o tamaño de fragmento fijo (descarga ZIP).",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "legend_mode": "Modo de división",
    "mode_each": "Un archivo por página",
    "mode_chunk": "Grupos de páginas fijas",
    "chunk_size_label": "Páginas por grupo",
    "hint_each": "Cada página se exporta como su propio PDF.",
    "hint_chunk": "Exportación grupal cada {chunk} páginas.",
    "btn_split": "Dividir y descargar ZIP",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_done_zip": "Se inició la generación ZIP.",
    "err_failed": "División fallida",
    "thumb_preview_title": "Preview (browse only; split follows options above)",
    "mode_selected": "Extraiga las páginas seleccionadas en un PDF",
    "hint_selected": "Haga clic en las miniaturas a continuación para seleccionar páginas. Las {count} páginas seleccionadas se exportarán como un PDF en el orden original.",
    "msg_pick_pages": "Seleccione al menos una página de las miniaturas a continuación.",
    "msg_done_pdf": "PDF de la página seleccionada generado y descarga iniciada.",
    "selected_download_name": "paginas-seleccionadas.pdf",
    "selected_count": "{count} páginas seleccionadas",
    "first_page": "Seleccionar página 1",
    "first_three": "Seleccionar primero 3",
    "clear_selected": "Borrar selección"
  },
  "pdf_stamp": {
    "drop_pdf_label": "Elija PDF",
    "drop_pdf_desc": "Documento base; elija páginas para sellar.",
    "drop_stamp_label": "Imagen del sello (se recomienda PNG)",
    "drop_stamp_desc": "PNG o JPEG; PNG transparente generalmente se ve mejor.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "empty_stamp": "Aún no hay imagen de sello.",
    "position_label": "Posición",
    "scale_label": "Escala (relativa al ancho de la imagen)",
    "margin_label": "Margen (pt)",
    "pos_center": "Centro",
    "pos_br": "Abajo a la derecha",
    "pos_bl": "Abajo a la izquierda",
    "pos_tr": "Arriba a la derecha",
    "pos_tl": "Arriba a la izquierda",
    "btn_apply": "Sello y descarga",
    "msg_need_both": "Seleccione un PDF y una imagen de sello (PNG/JPG).",
    "msg_pick_pages": "Seleccione las páginas para sellar.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "Error",
    "download_name": "stamped.pdf​"
  },
  "pdf_to_images": {
    "hint_base": "Exportar como imágenes. La nitidez sigue la escala: cuanto más alto es más claro, pero más lento y consume más memoria.",
    "hint_fallback": " No se admite la renderización fuera de pantalla; algunos formatos recurren a PNG.",
    "drop_label": "Elija PDF",
    "drop_desc": "Realice selección múltiple o colóquelos en lotes; cada página se convierte en una imagen en un ZIP; solo local.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "err_no_pdf": "No se reconocen archivos PDF.",
    "scale_label": "Escala de renderizado (se sugiere 1,5 – 3)",
    "fmt_label": "Formato de exportación",
    "opt_png": "PNG (sin pérdidas)",
    "opt_jpeg": "JPG (más pequeño)",
    "opt_webp": "WebP (más pequeño)",
    "quality_label": "Calidad (0.1 – 1.0)",
    "btn_export": "Exportar (ZIP)",
    "msg_select_pdf": "Elija un PDF primero.",
    "progress_export": "Exportando página {current} / {total}…",
    "progress_export_multi": "Archivo {fileIndex}/{fileTotal}: ​​{fileName} — página {current}/{total}…",
    "msg_zip_done": "Empaquetado en ZIP; descarga iniciada.",
    "err_failed": "Exportación fallida",
    "err_cancelled": "Cancelado",
    "page_range": "Rango de páginas (todas / impares / pares / 1,3-5)",
    "page_range_invalid": "Rango de páginas no válido. Utilice todo, par, impar o un rango como 1,3-5."
  },
  "pdf_watermark": {
    "intro": "Marcas de agua de texto chino a través del subconjunto OSS Source Han Sans. Si falla la recuperación de fuentes, se utilizan fuentes incrustadas y el chino puede aparecer como cuadros.",
    "drop_label": "Elija PDF",
    "drop_desc": "Agregue marcas de agua de texto a las páginas elegidas localmente.",
    "empty_pdf": "Aún no se ha seleccionado ningún PDF.",
    "page_range_hint": "Consejo: todo / impar / par / 1,3-5",
    "label_text": "Texto de marca de agua",
    "label_color": "Color (#RRGGBB)​",
    "label_font_size": "Tamaño de fuente",
    "label_opacity": "Opacidad (0–1)",
    "label_angle": "Rotación (grados)",
    "btn_generate": "Generar y descargar",
    "msg_select_pdf": "Elija un PDF primero.",
    "msg_pick_pages": "Seleccionar páginas para marcar con agua.",
    "msg_done": "Descarga finalizada.",
    "err_failed": "Error",
    "download_name": "watermarked.pdf​"
  },
  "json_format": {
    "indent_label": "Sangría",
    "indent_2": "2 espacios",
    "indent_4": "4 espacios",
    "indent_tab": "Tabulador",
    "font_size_label": "Tamaño de fuente",
    "valid_ok": " ✓ Válido",
    "valid_bad": "✗ No válido",
    "btn_escape": "Escapar / Desescapar",
    "btn_json_xml": "JSON ↔ XML​",
    "btn_fold": "Plegar / Desplegar",
    "hdr_src": "Fuente",
    "hdr_result": "Resultado (editable)",
    "ph_src": "Pegue o ingrese JSON aquí...",
    "ph_result": "El JSON formateado aparece aquí...",
    "flash_unescape_fmt_ok": "Sin escape y formateado correctamente",
    "flash_unescape_ok_maybe": "Sin escape (puede que no sea un JSON válido)",
    "flash_unescape_fail": "Sin escape falló",
    "flash_escape_ok": "Escapado con éxito",
    "flash_escape_ok_maybe": "Escapado con éxito (la fuente puede no ser un JSON válido)",
    "flash_escape_fail": "Escapado fallido",
    "flash_please_data": "Ingrese los datos primero",
    "flash_xml_bad": "Error de conversión: XML no válido",
    "flash_json_bad": "Error de conversión: JSON no válido",
    "hint_xml_done": "Convertido a XML",
    "hint_json_done": "Convertido a JSON",
    "flash_need_json_src": "Ingrese primero JSON en el panel de origen",
    "flash_need_valid_json": "Formatee o ingrese JSON válido primero",
    "hint_all_fold": "Todo plegado",
    "hint_all_unfold": "Todo desplegado",
    "flash_result_empty": "El resultado está vacío",
    "flash_clipboard_ok": "Copiado al portapapeles",
    "flash_no_download": "No hay nada para descargar",
    "confirm_plain_download": "El contenido no es JSON válido. ¿Descargar de todos modos?",
    "suffix_json_invalid": "JSON no válido",
    "btn_copy_result": "Copiar resultado"
  },
  "og_preview": {
    "mock_card_title": "Tarjeta simulada (no es una vista previa real del rastreador)",
    "tag_snippet_title": "Metafragmento",
    "demo_title": "Herramientas Ku | Ejemplo",
    "demo_desc": "Descripción de ejemplo para una tarjeta compartida simulada localmente."
  },
  "robots": {
    "chk_allow_site": "Permitir: / (permitir rastreos de sitios completos)",
    "lbl_disallow_paths": "No permitir rutas (una por línea)",
    "lbl_sitemap_urls": "URL del mapa del sitio (una por línea)",
    "hdr_preview": "robots.txt​"
  },
  "sitemap": {
    "lbl_site_root": "URL raíz del sitio",
    "lbl_paths": "Rutas o URL completas (una por línea)",
    "hdr_preview": "sitemap.xml​"
  },
  "csp": {
    "opt_default": "default-src 'self'​",
    "opt_script": "script-src 'self'​",
    "opt_unsafe_inline": "Permitir scripts en línea (más débiles)",
    "opt_style": "style-src 'self' 'unsafe-inline'​",
    "opt_img": "img-src * datos:",
    "opt_font": "font-src 'self'​",
    "opt_connect": "connect-src 'self'​",
    "opt_frame": "frame-ancestors 'none'​",
    "opt_base": "base-uri 'self'​",
    "opt_form": "form-action 'self'​",
    "opt_upgrade": "actualización-solicitudes-inseguras",
    "lbl_extra_directives": "Directivas adicionales (una por línea; unidas con punto y coma)",
    "hdr_preview": "Content-Security-Policy​",
    "placeholder_extra": "report-uri https://...​"
  },
  "permissions_policy": {
    "lbl_extra": "Entradas adicionales (separadas por comas)",
    "hdr_preview": "Permissions-Policy​",
    "placeholder_extra": "interest-cohort=()​"
  },
  "env_parse": {
    "chk_mask": "Valores de máscara (solo visualización; texto fuente sin cambios)",
    "lbl_raw": "Contenido de .env",
    "th_key": "Clave",
    "th_value": "Valor",
    "empty_rows": "Sin filas clave=valor"
  },
  "http_headers": {
    "intro": "Ejemplos de encabezados de respuestas de seguridad comunes; configurar una pila (Nginx / CDN / framework).",
    "hsts_title": "HSTS​",
    "hsts_desc": "Forzar HTTPS (edad máxima de un año)",
    "xcto_title": "X-Content-Type-Options​",
    "xcto_desc": "Deshabilitar el rastreo de MIME",
    "xfo_title": "X-Frame-Options​",
    "xfo_desc": "Denegar incrustación (igual que DENY)",
    "ref_title": "Referrer-Policy​",
    "ref_desc": "Apretar Referer",
    "pp_title": "Permissions-Policy (muestra)",
    "pp_desc": "Deshabilitar algunas API sensibles"
  },
  "graphql_format": {
    "lbl_input": "GraphQL​",
    "syntax_error": "Error de sintaxis"
  },
  "openapi_view": {
    "lbl_input": "OpenAPI (JSON)​",
    "err_invalid_json": "No se pudo analizar JSON",
    "root_label": "raíz"
  },
  "properties_json": {
    "lbl_properties": ".properties​",
    "lbl_json": "JSON (valores de cadena → propiedades)",
    "btn_to_json": "→ JSON​",
    "btn_to_properties": "→ Propiedades",
    "footnote_flat": "Los objetos anidados no se aplanan; solo mapas de cadenas planos.",
    "err_failed": "Error"
  },
  "xml_format": {
    "lbl_xml": "XML​",
    "btn_validate_indent": "Validar y sangrar",
    "err_parse_failed": "Error al analizar XML",
    "err_failed": "Error"
  },
  "semver": {
    "lbl_a": "Versión A",
    "lbl_b": "Versión B",
    "btn_compare": "Comparar",
    "invalid": "inválido",
    "err_parse_line": "Error al analizar: A={a}  B={b}",
    "cmp_before": "A está antes de B",
    "cmp_after": "A está después de B",
    "cmp_equal": "Igual",
    "line_norm": "Normalizado: A={a}  B={b}",
    "line_cmp": "Comparar: {rel}",
    "line_diff": "semver.diff: {diff}​",
    "diff_same": "diff: (misma versión)"
  },
  "mermaid": {
    "lbl_source": "Fuente de Mermaid",
    "btn_render": "Renderizar",
    "btn_rendering": "Renderizando…",
    "err_render": "Error al renderizar"
  },
  "editorconfig": {
    "preset_web": "Web predeterminado (2 espacios)",
    "preset_py": "Python (4 espacios)",
    "preset_go": "Go (Tabulador)"
  },
  "image_compress": {
    "intro_note": "Las imágenes se procesan localmente en su navegador y nunca se cargan. La compresión se ejecuta en paralelo según la capacidad del dispositivo mientras se controla el uso de memoria. PNG admite cuantización inteligente visualmente sin pérdidas o compresión estricta pixel-perfect. El original se conserva cuando el resultado no es más pequeño.",
    "drop_desc": "Se admite el procesamiento por lotes. Los componentes de compresión se preparan tras la selección y las dimensiones de la imagen permanecen sin cambios.",
    "fmt_auto": "Igual que el original",
    "fmt_jpeg": "Unificar como JPG",
    "fmt_webp": "Unificar como WebP",
    "fmt_png": "Unificar como PNG",
    "quality_label": "Calidad de compresión",
    "quality_high": "Alta calidad",
    "quality_balanced": "Recomendado (equilibrado)",
    "quality_strong": "Compresión fuerte",
    "png_mode_label": "Modo de compresión PNG",
    "png_mode_smart": "Compresión inteligente (recomendado)",
    "png_mode_lossless": "Sin pérdidas estricto",
    "png_smart_hint": "El modo inteligente fusiona colores similares y puede reducir enormemente el tamaño PNG casi sin cambios visibles, pero no es sin pérdidas pixel-perfect.",
    "png_lossless_hint": "El modo sin pérdidas estricto conserva cada píxel y solo optimiza la codificación PNG, por lo que el ahorro suele ser menor que en el modo inteligente.",
    "progress": "Completado {completed} / {total}",
    "worker_hint": "Procesando en paralelo con {count} trabajadores en segundo plano",
    "preparing_hint": "Preparando componentes de compresión de imagen…",
    "fallback_hint": "El procesamiento de imagen en segundo plano no está disponible en este navegador; el modo de compatibilidad está activo",
    "cancel": "Cancelar compresión",
    "cancelling": "Cancelando…",
    "cancelled": "La compresión fue cancelada. Los resultados completados permanecen disponibles.",
    "completed": "Completadas {count} imágenes.",
    "size_change": "Tamaño total: {before} → {after}",
    "saved": "Ahorrado: {size} ({percent}%)",
    "original_kept": "Originales conservados: {count}"
  },
  "image_exif": {
    "intro_note": "La visualización/eliminación ocurre localmente. La eliminación reexporta la imagen (más universal) y puede cambiar el tamaño/formato.",
    "drop_desc": "Analizar EXIF localmente; los archivos no se cargan.",
    "empty_hint": "Ninguna imagen seleccionada.",
    "lbl_export_after_strip": "Formato después de eliminar",
    "opt_jpeg_rec": "JPG (recomendado)",
    "opt_png": "PNG​",
    "opt_webp": "WebP​",
    "btn_strip": "Eliminar EXIF y descargar",
    "details_raw": "JSON EXIF sin procesar",
    "msg_no_exif": "No se detectó EXIF (o el formato no tiene).",
    "msg_read_fail": "Error de lectura",
    "msg_exported_clean": "Exportada versión sin metadatos.",
    "msg_strip_fail": "Error de procesamiento"
  },
  "image_crop": {
    "intro_note": "Arrastre en la vista previa para seleccionar el área de recorte, o ingrese píxeles abajo. El procesamiento es local.",
    "drop_desc": "Recorte de imagen única; exportar PNG / JPG / WebP.",
    "empty_hint": "Ninguna imagen seleccionada.",
    "hint_canvas": "Origen {w}×{h} px — arrastre sobre la imagen para seleccionar",
    "lbl_left_x": "Izquierda X",
    "lbl_top_y": "Superior Y",
    "lbl_width": "Ancho",
    "lbl_height": "Alto",
    "btn_reset_full": "Restablecer a imagen completa",
    "lbl_quality_short": "Calidad",
    "btn_export": "Exportar recorte",
    "msg_pick_area": "Seleccione una imagen y un área de recorte.",
    "msg_exported": "Recorte exportado.",
    "msg_export_fail": "Exportación fallida"
  },
  "image_resize": {
    "intro_note": "El redimensionamiento se ejecuta localmente. contener = ajustar dentro con relleno; cubrir = llenar y recortar.",
    "drop_desc": "Configure tamaño y formato abajo, luego haga clic en Iniciar procesamiento para exportar por lotes."
  },
  "image_scale": {
    "intro_note": "Escalado proporcional por borde largo, ancho fijo o alto fijo; relación de aspecto preservada. El modo de borde largo conserva los originales más pequeños que el objetivo; los modos de ancho/alto pueden ampliar. Procesamiento local.",
    "drop_desc": "Configure el modo de escala y los píxeles objetivo, luego exporte por lotes.",
    "lbl_scale_by": "Escalar por",
    "mode_long_edge": "Borde largo (solo reducir al límite)",
    "mode_width": "Ancho (ancho fijo, alto proporcional)",
    "mode_height": "Alto (alto fijo, ancho proporcional)",
    "dim_long_edge": "Límite de borde largo (px)",
    "dim_width": "Ancho objetivo (px)",
    "dim_height": "Alto objetivo (px)",
    "lbl_quality_01": "Calidad (0.1–1)"
  },
  "image_transform": {
    "intro_note": "Canvas + filtros CSS (escala de grises/invertir) localmente; la exportación JPEG compone la transparencia sobre blanco.",
    "drop_desc": "Formatos ráster comunes; configure transformaciones y luego exporte por lotes.",
    "lbl_rotate": "Rotar",
    "rot_0": "Ninguno",
    "rot_90": "90° horario",
    "rot_180": "180°​",
    "rot_270": "270° horario",
    "lbl_export_fmt": "Formato de exportación",
    "lbl_quality_short": "Calidad",
    "flip_h": "Voltear horizontal",
    "flip_v": "Voltear vertical",
    "filter_gray": "Escala de grises",
    "filter_invert": "Invertir",
    "msg_need_transform": "Seleccione al menos una transformación (rotar, voltear o filtro).",
    "msg_summary": "Listo: {ok}/{total} exitoso(s).",
    "btn_zip": "Descargar paquete ZIP"
  },
  "image_watermark": {
    "intro_note": "Las marcas de agua se renderizan localmente; no se carga nada.",
    "drop_desc": "Configure texto de marca de agua, luego exporte por lotes.",
    "lbl_text": "Texto de marca de agua",
    "lbl_position": "Posición",
    "pos_tl": "Arriba a la izquierda",
    "pos_tr": "Arriba a la derecha",
    "pos_bl": "Abajo a la izquierda",
    "pos_br": "Abajo a la derecha",
    "pos_center": "Centro",
    "lbl_color": "Color​",
    "lbl_font_size": "Tamaño de fuente",
    "lbl_opacity": "Opacidad (0–1)",
    "lbl_padding": "Relleno (px)",
    "msg_empty_text": "El texto de la marca de agua no puede estar vacío."
  },
  "image_collage": {
    "intro_note": "La unión se ejecuta localmente; evite demasiadas imágenes (resultado muy alto/ancho).",
    "drop_label": "Seleccionar imágenes (orden = orden de unión)",
    "drop_desc": "Selección múltiple admitida; el orden de la lista es el orden de unión—elimine elementos para ajustar.",
    "empty_hint": "Sin imágenes aún. El orden aquí define el orden de unión.",
    "lbl_direction": "Dirección",
    "dir_vertical": "Vertical (tira larga)",
    "dir_horizontal": "Horizontal​",
    "lbl_gap": "Espacio (px)",
    "msg_started": "Descarga iniciada."
  },
  "image_convert": {
    "page_intro": "Formatos ráster comunes (incluyendo <fmt>PNG, JPEG, WebP, GIF, BMP, ICO, AVIF</fmt>, según la decodificación del navegador) y <svg>SVG</svg> se convierten localmente. GIF animado exporta solo el primer fotograma; las áreas transparentes se rellenan de blanco al exportar JPEG; HEIC y formatos similares a menudo no se pueden decodificar en el navegador.",
    "common_uses_title": "Usos comunes",
    "common_use_li1": "Unificar recursos web a WebP o PNG; flujos de impresión/archivo a JPEG.",
    "common_use_li2": "Rasterizar SVG a mapa de bits para herramientas posteriores que solo aceptan ráster."
  },
  "image_convert_to_png": {
    "page_intro": "Exporte formatos de imagen comunes a PNG localmente en su dispositivo—nada sale de su máquina. Útil cuando necesita un flujo de trabajo solo PNG o el proceso posterior solo acepta PNG. Las imágenes animadas exportan el primer fotograma.",
    "common_notes_title": "Notas",
    "common_notes_li1": "HEIC y algunos formatos de proveedor pueden no decodificarse en el navegador—convierta a JPG en su sistema operativo primero.",
    "common_notes_li2": "Imágenes muy grandes usan más memoria; si la conversión falla, redimensione o divida.",
    "drop_subline": "Entrada multiformato; la salida siempre es PNG."
  },
  "image_gif_to_png": {
    "drop_subline": "Enfocado en GIF; exporta PNG de un solo fotograma."
  },
  "image_jpg_to_png": {
    "page_intro": "<jpeg>JPEG</jpeg> es con pérdidas; convertir a PNG no puede recuperar el detalle descartado, pero evita mayor compresión con pérdidas—útil cuando su flujo de edición o trabajos por lotes se estandarizan en PNG. Selección múltiple y arrastrar y soltar admitidos.",
    "notes_title": "Notas",
    "notes_body": "Las fotos JPEG típicas son opacas; después de la conversión a PNG suelen permanecer completamente opacas a menos que el origen ya tuviera transparencia (poco común).",
    "drop_subline": "Enfocado en JPG/JPEG; otros ráster permitidos. La salida es PNG."
  },
  "image_jpg_to_webp": {
    "drop_subline": "Enfocado en JPG/JPEG; otros ráster a WebP también admitidos."
  },
  "image_png_to_jpg": {
    "drop_subline": "Enfocado en PNG; otros ráster a JPG también admitidos."
  },
  "image_png_to_webp": {
    "drop_subline": "Enfocado en PNG; otros ráster a WebP también admitidos."
  },
  "image_svg_to_png": {
    "drop_subline": "Seleccione archivos .svg; la salida es PNG."
  },
  "image_webp_to_jpg": {
    "drop_subline": "Enfocado en WebP; otros ráster a JPG también admitidos."
  },
  "image_webp_to_png": {
    "page_intro": "Muchos sitios envían recursos <webp>WebP</webp> más pequeños; cuando su herramienta de destino solo acepta PNG, convierta por lotes localmente aquí antes de importar a otro lugar. Selección de múltiples archivos admitida.",
    "tips_title": "Consejo",
    "tips_body": "WebP con pérdidas, sin pérdidas y transparente se rasterizan en el navegador antes de guardar como PNG—similar a exportar desde aplicaciones gráficas de escritorio en la mayoría de los casos.",
    "drop_subline": "Enfocado en WebP; otros ráster permitidos; la salida siempre es PNG."
  },
  "image_ico": {
    "intro_note": "Cree favicon.ico desde una imagen localmente: elija un tamaño cuadrado y descargue (PNG dentro de ICO para navegadores modernos y Windows).",
    "drop_desc": "Elija el tamaño, luego descargue favicon.ico.",
    "pick_label": "Seleccionar imagen (512×512 o mayor recomendado)",
    "empty_hint": "Ninguna imagen seleccionada.",
    "lbl_side": "Lado de salida (cuadrado)",
    "hint_one_size": "ICO contiene solo el tamaño seleccionado.",
    "err_pick_first": "Seleccione una imagen primero.",
    "err_canvas": "No se pudo crear el contexto del canvas",
    "msg_download_started": "Descarga de favicon.ico iniciada.",
    "msg_generate_fail": "Error al generar",
    "page_intro": "Seleccione una imagen grande (512×512 o mayor recomendado), elija la longitud del borde de salida, luego descargue <favicon>favicon.ico</favicon>."
  },
  "image_ocr": {
    "intro_note": "El trabajador de Tesseract, el núcleo y los paquetes de idioma se cargan desde CDN (la primera ejecución es más lenta). Las imágenes permanecen en su navegador.",
    "lbl_langs": "Idiomas (códigos Tesseract, p.ej. eng, chi_sim, eng+chi_sim)",
    "lbl_image": "Imagen",
    "hdr_result": "Texto reconocido",
    "prog_initializing": "Inicializando…",
    "prog_recognizing": "Reconociendo {pct}%",
    "empty_result": "(Sin texto reconocido)",
    "err_failed": "Error de reconocimiento",
    "lang_zh_en": "Chino simplificado + Inglés",
    "lang_zh": "Chino simplificado",
    "lang_ja_en": "Japonés + Inglés",
    "lang_zh_tw_en": "Chino tradicional + Inglés",
    "copy": "Copiar texto",
    "download_txt": "Descargar TXT"
  },
  "bcrypt": {
    "text_label": "Texto",
    "rounds_label": "Rondas (4-31)",
    "generate": "Generar hash",
    "copy": "Copiar",
    "verify_hash_label": "Hash a verificar",
    "verify": "Verificar",
    "match": "Coincide",
    "not_match": "No coincide"
  },
  "sm3": {
    "text_label": "Texto de entrada",
    "compute": "Calcular",
    "copy": "Copiar"
  },
  "sm4": {
    "key_label": "Clave (32 caracteres hex)",
    "text_label": "Texto de entrada",
    "encrypt": "Cifrar",
    "decrypt": "Descifrar",
    "process": "Procesar",
    "copy": "Copiar",
    "error": "Error​"
  },
  "sm2": {
    "generate_keypair": "Generar par de claves",
    "public_key": "Clave pública",
    "private_key": "Clave privada",
    "text_label": "Texto de entrada",
    "encrypt": "Cifrar",
    "decrypt": "Descifrar",
    "copy": "Copiar",
    "error": "Error​"
  },
  "password_strength": {
    "password_label": "Contraseña",
    "level_0": "Débil",
    "level_1": "Regular",
    "level_2": "Fuerte",
    "level_3": "Muy fuerte",
    "length": "Longitud",
    "crack_time": "Tiempo de descifrado",
    "lower": "Minúsculas",
    "upper": "Mayúsculas",
    "digit": "Dígito",
    "special": "Especial"
  },
  "wifi_qr": {
    "ssid": "SSID​",
    "password": "Contraseña",
    "encryption": "Cifrado",
    "none": "Ninguno",
    "generate": "Generar QR"
  },
  "json_to_go": {
    "struct_name": "Nombre del struct",
    "json_label": "JSON de entrada",
    "convert": "Convertir",
    "copy": "Copiar",
    "parse_error": "Error al analizar JSON"
  },
  "json_to_java": {
    "class_name": "Nombre de clase",
    "json_label": "JSON de entrada",
    "convert": "Convertir",
    "copy": "Copiar",
    "parse_error": "Error al analizar JSON"
  },
  "json_to_sql": {
    "table_name": "Nombre de tabla",
    "json_label": "Arreglo JSON de entrada",
    "convert": "Convertir",
    "copy": "Copiar",
    "parse_error": "Error al analizar JSON",
    "not_array": "La entrada no es un arreglo JSON"
  },
  "json_merge": {
    "json_a": "JSON A​",
    "json_b": "JSON B​",
    "merge": "Fusionar",
    "copy": "Copiar",
    "parse_error": "Error al analizar JSON"
  },
  "nginx_format": {
    "input_label": "Configuración Nginx de entrada",
    "format": "Formato",
    "copy": "Copiar"
  },
  "docker_to_compose": {
    "cmd_label": "Comando docker run de entrada",
    "convert": "Convertir",
    "copy": "Copiar"
  },
  "regex_cheatsheet": {
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "faker": {
    "generate": "Generar datos falsos"
  },
  "deobfuscate": {
    "input_label": "Código JS de entrada",
    "format": "Formato",
    "copy": "Copiar"
  },
  "text_pinyin": {
    "input_label": "Chino de entrada",
    "copy": "Copiar"
  },
  "text_zh_convert": {
    "s2t": "Simp→Trad​",
    "t2s": "Trad→Simp​",
    "input_label": "Texto de entrada",
    "copy": "Copiar"
  },
  "text_mask": {
    "input_label": "Texto de entrada",
    "keep_first": "Conservar primeros N",
    "keep_last": "Conservar últimos N",
    "mask_char": "Carácter de máscara",
    "copy": "Copiar"
  },
  "text_emoji": {
    "search_placeholder": "Buscar Emoji…",
    "copied": "Copiado"
  },
  "text_synonym": {
    "input_label": "Palabra de entrada",
    "synonyms": "Sinónimos",
    "antonyms": "Antónimos",
    "not_found": "No encontrado en el diccionario"
  },
  "totp": {
    "secret_label": "Secreto (Base32)",
    "remaining": "{sec}s restantes"
  },
  "basic_auth": {
    "username": "Nombre de usuario",
    "password": "Contraseña",
    "copy": "Copiar"
  },
  "cookie_parse": {
    "input_label": "Cadena de Cookie de entrada",
    "key": "Clave",
    "value": "Valor"
  },
  "jwt_generate": {
    "header": "Encabezado (JSON)",
    "payload": "Carga útil (JSON)",
    "secret": "Secreto",
    "generate": "Generar JWT",
    "copy": "Copiar",
    "error": "Error al generar"
  },
  "svg_placeholder": {
    "width": "Ancho",
    "height": "Alto",
    "text": "Texto",
    "fg": "Primer plano",
    "bg": "Fondo",
    "copy_svg": "Copiar SVG",
    "copy_data_url": "Copiar URL de datos"
  },
  "stopwatch": {
    "start": "Inicio",
    "pause": "Pausar",
    "resume": "Reanudar",
    "lap": "Vuelta",
    "reset": "Reiniciar",
    "lap_n": "Vuelta {n}"
  },
  "date_calc": {
    "add_days": "Sumar/restar días",
    "date_diff": "Diferencia de fechas",
    "date1": "Fecha",
    "date2": "Fecha 2",
    "days": "Días",
    "calc": "Calcular"
  },
  "percentage": {
    "mode_of": "X% de Y",
    "mode_is": "X es qué % de Y",
    "mode_change": "Tasa de cambio",
    "percent": "Porcentaje",
    "of_value": "Valor",
    "value": "Valor",
    "total": "Total​",
    "from": "Desde",
    "to": "Hasta"
  },
  "temperature": {
    "value": "Temperatura"
  },
  "roman_numeral": {
    "to_roman": "→ Romano",
    "from_roman": "→ Arábigo",
    "arabic": "Arábigo",
    "roman": "Romano"
  },
  "image_greyscale": {
    "process": "A escala de grises",
    "download": "Descargar"
  },
  "image_nine_grid": {
    "process": "Recorte en nueve cuadrículas"
  },
  "mac_lookup": {
    "input_label": "Dirección MAC de entrada",
    "not_found": "Fabricante no encontrado"
  },
  "ipv4_range": {
    "start": "IP inicial",
    "end": "IP final"
  },
  "port_reference": {
    "port": "Puerto",
    "proto": "Protocolo",
    "name": "Nombre"
  },
  "math_eval": {
    "placeholder": "Ingrese expresión, p.ej. 2^10 + sqrt(16)",
    "calc": "Calcular",
    "preview": "Vista previa",
    "supported": "Operaciones admitidas",
    "history": "Historial",
    "clear": "Borrar",
    "copy_result": "Copiar resultado",
    "copied": "Resultado copiado.",
    "radian_note": "Las funciones trigonométricas usan radianes, por ejemplo sin(pi/2) = 1."
  },
  "eta_calc": {
    "total": "Total​",
    "done": "Hecho",
    "elapsed": "Transcurrido",
    "elapsed_unit": "segundos",
    "speed": "Velocidad",
    "speed_unit": "/s​",
    "remaining": "Tiempo estimado",
    "total_time": "Est. total"
  },
  "mac_gen": {
    "count": "Cantidad",
    "separator": "Separador",
    "prefix": "Prefijo (opcional)",
    "uppercase": "Mayúsculas",
    "generate": "Generar",
    "results": "Resultados",
    "copy_all": "Copiar todo"
  },
  "device_info": {
    "note": "Detectar información del entorno actual del navegador.",
    "property": "Propiedad",
    "value": "Valor"
  },
  "bip39": {
    "strength": "Bits de entropía",
    "generate": "Generar",
    "loading": "Cargando…",
    "mnemonic": "Mnemónico",
    "copy": "Copiar",
    "error": "Error al generar"
  },
  "rsa_keygen": {
    "key_size": "Tamaño de clave",
    "generate": "Generar par de claves",
    "generating": "Generando…",
    "public_key": "Clave pública (PEM)",
    "private_key": "Clave privada (PEM)",
    "copy": "Copiar"
  },
  "xml_json": {
    "input": "Entrada",
    "output": "Salida",
    "convert": "Convertir",
    "copy": "Copiar"
  },
  "json_minify": {
    "input": "JSON de entrada",
    "minify": "Minificar",
    "output": "Salida",
    "copy": "Copiar",
    "original": "Original​",
    "minified_size": "Minificado",
    "saved": "Guardado"
  },
  "numeronym": {
    "encode": "Codificación",
    "decode": "Decodificar",
    "examples": "Ejemplos comunes"
  },
  "ascii_art": {
    "text": "Texto",
    "char_set": "Carácter de relleno",
    "result": "Resultado",
    "copy": "Copiar",
    "hint": "Admite letras en inglés, dígitos y algunos signos de puntuación, hasta 30 caracteres."
  },
  "idcard": {
    "input_label": "Número de documento de identidad",
    "valid": "Válido",
    "invalid": "Inválido",
    "province": "Provincia",
    "birthday": "Fecha de nacimiento",
    "gender": "Género",
    "male": "Masculino",
    "female": "Femenino",
    "unknown": "Desconocido"
  },
  "chinese_colors": {
    "copied": "Copiado"
  },
  "relationship": {
    "input_label": "Cadena de parentesco (p.ej., padre,madre)",
    "placeholder": "padre,madre",
    "unknown": "Desconocido"
  },
  "curl_to_code": {
    "input_label": "Comando cURL",
    "lang_label": "Lenguaje de destino",
    "convert": "Convertir",
    "output": "Código de salida",
    "copy": "Copiar",
    "copied": "Copiado",
    "err_parse": "No se pudo analizar el comando cURL"
  },
  "box_shadow": {
    "layer": "Capa",
    "remove": "Eliminar",
    "offsetX": "Desplazamiento X",
    "offsetY": "Desplazamiento Y",
    "blur": "Desenfoque",
    "spread": "Extensión",
    "color": "Color​",
    "add_layer": "Agregar capa",
    "preview": "Vista previa",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "border_radius": {
    "top_left": "Superior izquierda",
    "top_right": "Superior derecha",
    "bottom_right": "Inferior derecha",
    "bottom_left": "Inferior izquierda",
    "preview": "Vista previa",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "flexbox": {
    "direction": "flex-direction​",
    "justify_content": "justify-content​",
    "align_items": "align-items​",
    "flex_wrap": "flex-wrap​",
    "gap": "gap​",
    "add_child": "Agregar hijo",
    "remove_child": "Eliminar hijo",
    "preview": "Vista previa",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "gradient": {
    "type": "Tipo",
    "angle": "Ángulo",
    "color_stops": "Paradas de color",
    "remove": "Eliminar",
    "add_stop": "Agregar parada",
    "preview": "Vista previa",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "css_animation": {
    "preset": "Preajuste",
    "duration": "Duración(s)",
    "timing": "Temporización",
    "iteration": "Iteración",
    "keyframes": "Fotogramas clave",
    "preview": "Vista previa",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "color_blindness": {
    "input_color": "Color de entrada",
    "original": "Original​",
    "palette": "Vista previa de paleta"
  },
  "token_count": {
    "input_label": "Texto de entrada",
    "placeholder": "Ingrese texto para estimar el conteo de tokens…",
    "chars": "caracteres",
    "words": "palabras",
    "lines": "líneas",
    "estimate": "Estimación de tokens",
    "tokens": "tokens​",
    "of_context": "del contexto",
    "disclaimer": "※ Estimación aproximada. El conteo real depende del tokenizador específico.",
    "model": "Modelo de referencia",
    "output_tokens": "Tokens de salida esperados",
    "input_estimate": "Tokens de entrada estimados",
    "context_usage": "Uso del contexto",
    "estimated_cost": "Costo estimado (USD)",
    "disclaimer_extended": "Esta es una aproximación basada en caracteres, no un resultado exacto del tokenizador oficial. Los precios y límites de contexto pueden cambiar; verifique los precios más recientes del proveedor antes de enviar una solicitud."
  },
  "screenshot_beautify": {
    "upload": "Subir captura de pantalla",
    "bg_color": "Fondo",
    "padding": "Relleno",
    "border_radius": "Radio del borde",
    "shadow_blur": "Desenfoque de sombra",
    "shadow_color": "Color de sombra",
    "preview": "Vista previa",
    "no_image": "Suba una captura de pantalla primero",
    "export_png": "Exportar PNG"
  },
  "pangu_spacing": {
    "input_label": "Texto de entrada",
    "placeholder": "Hello世界，这是123test文本​",
    "output": "Resultado",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "aspect_ratio": {
    "width": "Ancho",
    "height": "Alto",
    "calc_ratio": "Calcular proporción",
    "common_ratios": "Proporciones comunes",
    "reverse_calc": "Calcular a la inversa",
    "ratio_w": "Proporción W",
    "ratio_h": "Proporción H",
    "known_side": "Lado conocido",
    "known_value": "Valor conocido",
    "result": "Resultado"
  },
  "loan_calc": {
    "principal": "Monto del capital",
    "annual_rate": "Tasa anual (%)",
    "term": "Plazo del préstamo (años)",
    "term_half_year": "6 meses ({months} periodos)",
    "term_years": "{years, plural, one {1 año} other {# años}} ({months} periodos)",
    "method": "Método",
    "equal_installment": "Cuota fija",
    "equal_principal": "Capital fijo",
    "monthly_payment": "Pago mensual",
    "total_interest": "Interés total",
    "total_payment": "Pago total",
    "schedule": "Tabla de amortización",
    "month": "Mes",
    "payment": "Pago",
    "principal_part": "Capital",
    "interest_part": "Interés",
    "remaining": "Saldo restante"
  },
  "bmi": {
    "height": "Altura",
    "weight": "Peso",
    "underweight": "Bajo peso",
    "normal": "Normal​",
    "overweight": "Sobrepeso",
    "obese": "Obesidad",
    "range_chart": "Tabla de rangos de IMC"
  },
  "work_hours": {
    "summary_title": "Resumen de horas",
    "auto_calculate": "Se recalcula automáticamente cuando cambia cualquier turno",
    "shifts_unit": "turnos",
    "total_work": "Trabajo total",
    "regular_hours": "Horas regulares",
    "overtime": "Horas extra",
    "estimated_pay": "Pago estimado",
    "enter_hourly_rate": "Ingrese una tarifa por hora para calcular",
    "total_span": "Jornada en sitio",
    "total_break": "Descansos totales",
    "rules_title": "Reglas de cálculo y pago",
    "rules_hint": "Las horas extra se calculan por turno por encima del estándar diario. Las cifras de pago son solo estimaciones.",
    "standard_hours_day": "Horas estándar / día",
    "rounding": "Redondeo de tiempo",
    "no_rounding": "Sin redondeo (minutos exactos)",
    "nearest_minutes": "Al {minutes} minuto más cercano",
    "hourly_rate": "Tarifa por hora",
    "overtime_multiplier": "Multiplicador de horas extra",
    "currency": "Moneda",
    "timesheet_title": "Detalles del turno",
    "overnight_hint": "Una hora de finalización anterior a la de inicio se trata como un turno nocturno.",
    "fill_week": "Llenar esta semana laboral",
    "add_shift": "Agregar turno",
    "quick_shift": "Agregar rápido",
    "shift": "Turno",
    "date": "Fecha",
    "start_time": "Hora de inicio",
    "end_time": "Hora de fin",
    "break_minutes": "Descanso (minutos)",
    "note": "Nota",
    "note_placeholder": "Proyecto, ubicación, etc. (opcional)",
    "duplicate": "Duplicar",
    "remove": "Eliminar",
    "overnight": "Nocturno",
    "break_too_long": "El descanso es más largo que la duración del turno. El tiempo de trabajo de este turno se cuenta como cero.",
    "work_time": "Tiempo trabajado",
    "break_short": "Descanso",
    "hour_short": "h​",
    "minute_short": "m​",
    "work_minutes": "Minutos trabajados",
    "regular_minutes": "Minutos regulares",
    "overtime_minutes": "Minutos extra",
    "total_pay": "Pago total",
    "report_title": "Informe de horarios",
    "report_hint": "Copie un informe legible o exporte CSV para mayor edición.",
    "copy_report": "Copiar informe",
    "export_csv": "Exportar CSV",
    "reset": "Reiniciar turnos",
    "copied": "Informe de horarios copiado.",
    "exported": "CSV exportado.",
    "week_filled": "Se han agregado turnos de lunes a viernes para esta semana."
  },
  "template_filler": {
    "template_label": "Texto de plantilla",
    "template_placeholder": "Ingrese plantilla, p.ej.: Hola, '{' '{' 'nombre' '}' '}'!",
    "variables": "Variables​",
    "fill_data": "Llenar datos",
    "add_row": "Agregar fila",
    "row": "Fila",
    "remove_row": "Eliminar",
    "result": "Resultado",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "url_defang": {
    "defang": "Desarmar",
    "refang": "Rearmar",
    "input_label": "URL de entrada",
    "output": "Salida",
    "copy": "Copiar",
    "copied": "Copiado",
    "rules": "Reglas",
    "rule1": ":// → [://]​",
    "rule2": ". → [.]​",
    "rule3": "Rearmar es la operación inversa"
  },
  "protobuf_decode": {
    "decode": "Decodificar",
    "invalid_hex": "Entrada hexadecimal inválida",
    "result": "Resultado",
    "field": "Campo",
    "wire_type": "Tipo de cable",
    "value": "Valor",
    "unknown_wire": "Tipo de cable desconocido"
  },
  "pdf_signature": {
    "upload": "Subir PDF",
    "checking": "Verificando…",
    "signed": "Firmado",
    "not_signed": "No firmado",
    "file": "Archivo",
    "pages": "Páginas",
    "parse_error": "Error al analizar PDF"
  },
  "dev_string_obfuscator": {
    "input_label": "Código de entrada",
    "input_placeholder": "Pegue código JavaScript con literales de cadena…",
    "method_label": "Método de ofuscación",
    "method_base64": "Base64​",
    "method_hex": "Maleficio",
    "method_unicode": "Unicode​",
    "method_charcode": "CharCode​",
    "method_reverse": "Invertir",
    "obfuscate": "Ofuscar",
    "output": "Resultado ofuscado",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "dev_git_cheatsheet": {
    "category_basic": "Operaciones básicas",
    "category_branch": "Gestión de ramas",
    "category_remote": "Repositorio remoto",
    "category_undo": "Deshacer y revertir",
    "category_stash": "Stash​",
    "category_log": "Registro e historial",
    "copy": "Copiar",
    "copied": "Copiado",
    "click_copy": "Clic para copiar"
  },
  "html_wysiwyg": {
    "bold": "Negrita",
    "italic": "Cursiva",
    "underline": "Subrayado",
    "strikethrough": "Tachado",
    "ordered_list": "Lista ordenada",
    "unordered_list": "Lista desordenada",
    "mode_edit": "Visual​",
    "source_view": "Vista de código fuente",
    "preview": "Vista previa",
    "copy_html": "Copiar HTML",
    "copied": "Copiado",
    "prompt_url": "URL del enlace",
    "prompt_img_url": "URL de imagen"
  },
  "dev_css_unit_converter": {
    "context_title": "Referencia de px",
    "input_title": "Entrada",
    "value_label": "Valor",
    "from_unit": "Unidad de origen",
    "results_title": "Conversiones",
    "col_unit": "Unidad",
    "col_value": "Valor",
    "base_size_label": "Tamaño de fuente base (px)",
    "viewport_width": "Ancho del viewport (px)",
    "viewport_height": "Alto del viewport (px)",
    "result": "Resultado de conversión",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "web_meta_tag_generator": {
    "general": "Meta básico",
    "title_label": "Título",
    "description_label": "Descripción",
    "viewport_label": "Viewport​",
    "charset_label": "Juego de caracteres",
    "author_label": "Autor",
    "keywords_label": "Palabras clave",
    "robots_label": "Robots​",
    "og_title": "Título OG",
    "og_description": "Descripción OG",
    "og_image": "URL de imagen OG",
    "og_url": "OG URL​",
    "twitter_card": "Tipo de Twitter Card",
    "generate": "Generar",
    "output": "Código de meta etiquetas",
    "preview": "Vista previa",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "encode_unicode": {
    "input_label": "Texto de entrada",
    "output_label": "Salida",
    "encode": "Codificación",
    "decode": "Decodificar",
    "format_label": "Formato",
    "format_backslash_u": "\\uXXXX​",
    "format_html_entity": "&#xXXXX;​",
    "copy": "Copiar",
    "copied": "Copiado",
    "decode_failed": "Error de decodificación"
  },
  "encode_quoted_printable": {
    "input_label": "Entrada",
    "output_label": "Salida",
    "line_len": "Longitud máxima de línea",
    "encode": "Codificación",
    "decode": "Decodificar",
    "copy": "Copiar",
    "copied": "Copiado",
    "encode_failed": "Error al codificar",
    "decode_failed": "Error de decodificación",
    "err_decode": "Error al decodificar Quoted-Printable"
  },
  "encode_uuencode": {
    "input_label": "Entrada",
    "output_label": "Salida",
    "encode": "UUEncode​",
    "decode": "UUDecode​",
    "filename_label": "Nombre de archivo",
    "mode": "Modo de archivo (p.ej. 644)",
    "copy": "Copiar",
    "copied": "Copiado",
    "encode_failed": "Error al codificar",
    "decode_failed": "Error de decodificación",
    "err_decode": "Error de UUDecode"
  },
  "encode_base85": {
    "input_label": "Entrada",
    "input_mode": "Modo de entrada",
    "mode_text": "Texto (UTF-8)",
    "mode_hex": "Bytes hex",
    "delimiters": "envolver con <~ ~>",
    "output_label": "Salida",
    "encode": "Codificación",
    "decode": "Decodificar",
    "copy": "Copiar",
    "copied": "Copiado",
    "invalid_hex": "Entrada hexadecimal inválida",
    "encode_failed": "Error al codificar",
    "decode_failed": "Error de decodificación",
    "err_decode": "Error al decodificar Base85"
  },
  "camera_recorder": {
    "select_device": "Dispositivo de cámara",
    "default": "Predeterminado",
    "start_camera": "Iniciar cámara",
    "stop_camera": "Detener cámara",
    "take_photo": "Tomar foto",
    "start_record": "Iniciar grabación",
    "stop_record": "Detener grabación",
    "pause": "Pausar",
    "resume": "Reanudar",
    "recording": "Grabando…",
    "paused": "En pausa",
    "photo_result": "Foto",
    "video_result": "Video​",
    "export_photo": "Exportar PNG",
    "export_video": "Exportar WebM",
    "no_camera": "No se puede acceder a la cámara"
  },
  "text_regex_memo": {
    "category_chars": "Clases de caracteres",
    "category_quantifiers": "Cuantificadores",
    "category_anchors": "Anclas",
    "category_groups": "Grupos y referencias",
    "category_lookaround": "Lookaround (lookahead / lookbehind)​",
    "category_flags": "Banderas",
    "copy": "Copiar",
    "click_copy": "Clic para copiar",
    "copied": "Copiado"
  },
  "dev_git_diff_viewer": {
    "input_label": "Pegar salida de diff",
    "input_placeholder": "Pegar texto de salida de git diff…",
    "parse": "Analizar",
    "files_changed": "Archivos modificados",
    "additions": "Adiciones",
    "deletions": "Eliminaciones",
    "changes": "Cambios",
    "err_parse": "No se pudo analizar la salida de diff"
  },
  "web_url_query_editor": {
    "url_label": "URL de entrada",
    "url_placeholder": "https://example.com?key=value&foo=bar​",
    "parse": "Analizar",
    "url_encode": "Codificar URL al construir",
    "params": "Parámetros de consulta",
    "result": "URL construida",
    "key": "Clave",
    "value": "Valor",
    "add_param": "Agregar parámetro",
    "remove_param": "Eliminar",
    "preview": "Vista previa de URL",
    "copy": "Copiar",
    "copied": "Copiado",
    "err_invalid_url": "URL no válida"
  },
  "tax_calc": {
    "income_label": "Salario mensual (CNY)",
    "social_label": "Seguro social (mensual, CNY)",
    "special_label": "Deducción especial (mensual, CNY)",
    "calc": "Calcular",
    "taxable": "Ingreso imponible mensual: ",
    "annual_taxable": "Ingreso imponible anual: ",
    "rate": "Tasa impositiva: ",
    "monthly_tax": "Impuesto mensual: ",
    "annual_tax": "Impuesto anual: ",
    "after_tax": "Ingreso después de impuestos",
    "assumption": "Estima la retención acumulativa de residentes de China continental y asume el mismo ingreso mensual y deducciones durante todo el año.",
    "schedule": "Retención acumulativa mensual",
    "month": "Mes",
    "monthly_taxable": "Imponible mensual",
    "cumulative_taxable": "Imponible acumulado",
    "cumulative_tax": "Impuesto acumulado",
    "disclaimer": "Solo estimación; excluye casos especiales como bonificaciones anuales, ingresos por servicios y diferencias de retención previas."
  },
  "coord_convert": {
    "lng_label": "Longitud (lng)",
    "lat_label": "Latitud (lat)",
    "from_label": "Desde",
    "to_label": "Hasta",
    "convert": "Convertir",
    "result_label": "Resultado",
    "copy": "Copiar"
  },
  "sensitive_words": {
    "placeholder": "Pegue documentos oficiales, comunicados de prensa, avisos, etc.",
    "check": "Verificación estricta",
    "found_prefix": "Términos sensibles encontrados ({count} tipos): ",
    "col_word": "Término",
    "col_count": "Cantidad",
    "no_found": "Sin coincidencias en el diccionario, pero aún se requiere revisión manual antes de publicar.",
    "bank_count": "Diccionario estricto gubernamental: {count} términos",
    "mode_hint": "Detección de evasión habilitada: espacios en blanco y caracteres de ancho cero eliminados; ancho completo normalizado.",
    "disclaimer": "Esta herramienta no reemplaza la revisión de confidencialidad ni la aprobación humana final. Sin coincidencias no significa publicable.",
    "custom_dict_title": "Lista de palabras personalizada",
    "custom_dict_hint": "Texto UTF-8, un término por línea; las líneas que comienzan con # son comentarios. Almacenado localmente en su navegador.",
    "upload_dict": "Subir diccionario (.txt)",
    "upload_txt": "Subir texto a verificar (.txt)",
    "clear_custom": "Borrar lista personalizada",
    "custom_bank_count": "Personalizado {count}",
    "active_bank_count": "Activo {count}",
    "source_file": "Archivo fuente",
    "highlight_title": "Vista previa resaltada",
    "col_position": "Posiciones",
    "dict_imported": "Importados {count} términos personalizados",
    "dict_cleared": "Lista personalizada borrada",
    "err_dict_empty": "El archivo de diccionario está vacío o es inválido",
    "err_dict_parse": "Error al leer el archivo de diccionario",
    "err_txt_read": "Error al leer el archivo de texto"
  },
  "signature": {
    "color_label": "Color del trazo",
    "width_label": "Ancho del trazo",
    "export": "Exportar PNG",
    "clear": "Borrar"
  },
  "subtitle_convert": {
    "from_fmt": "Formato de origen",
    "to_fmt": "Formato de destino",
    "input_placeholder": "Pegar contenido de subtítulos…",
    "convert": "Convertir",
    "output": "Salida",
    "copy": "Copiar"
  },
  "htpasswd": {
    "username_label": "Nombre de usuario",
    "password_label": "Contraseña",
    "algorithm_label": "Algoritmo",
    "add": "Agregar",
    "copy": "Copiar todo"
  },
  "gcd_lcm": {
    "input_label": "Números (separados por comas)",
    "input_placeholder": "p.ej. 12, 18, 24",
    "calc": "Calcular"
  },
  "periodic_table": {
    "atomic_number": "Número atómico: ",
    "atomic_mass": "Masa atómica: ",
    "category": "Categoría: "
  },
  "danmaku": {
    "text_label": "Texto de Danmaku",
    "color_label": "Color​",
    "speed_label": "Velocidad",
    "send": "Enviar"
  },
  "teleprompter": {
    "placeholder": "Ingrese contenido del guion…",
    "speed_label": "Velocidad",
    "font_size_label": "Tamaño de fuente",
    "mirror_label": "Espejo",
    "play": "Reproducir",
    "stop": "Detener",
    "pause": "Pausar"
  },
  "batch_rename": {
    "add_files": "Agregar archivos",
    "prefix_label": "Prefijo",
    "start_num_label": "Número inicial",
    "pad_len_label": "Relleno con ceros",
    "ext_label": "Extensión",
    "col_original": "Original​",
    "col_renamed": "Renombrado",
    "copy": "Copiar lista"
  },
  "bankcard_bin": {
    "lookup_title": "Análisis de BIN / IIN de tarjeta",
    "lookup_hint": "Detecta la red de la tarjeta, prioriza la base local con {count} emisores chinos principales y valida números completos.",
    "mode_single": "Búsqueda individual",
    "mode_batch": "Búsqueda por lotes",
    "card_label": "BIN, IIN o número de tarjeta completo",
    "placeholder": "Ingrese 6–19 dígitos; se aceptan espacios",
    "clear": "Borrar",
    "examples": "Ejemplos",
    "privacy_note": "Toda la detección y validación se ejecuta en este navegador. Los números de tarjeta no se cargan y los resultados solo muestran números enmascarados.",
    "empty_title": "Ingrese los primeros 6 dígitos para comenzar",
    "empty_hint": "Ingrese un número de tarjeta completo para también ejecutar una verificación Luhn.",
    "masked_number": "Número enmascarado",
    "bank": "Emisor",
    "network": "Red de tarjeta",
    "card_type": "Tipo de tarjeta",
    "bin6": "BIN de 6 dígitos",
    "iin8": "IIN de 8 dígitos",
    "checksum": "Verificación de Luhn",
    "need_8_digits": "Se muestra después de 8 dígitos",
    "issuer_matched": "Emisor coincidente",
    "issuer_not_matched": "Emisor no coincidente",
    "issuer_unknown": "Emisor no disponible",
    "digit_unit": "dígitos",
    "digits": "Longitud",
    "copy_result": "Copiar resultado",
    "copied": "Resultados copiados.",
    "exported": "CSV exportado.",
    "checksum_not_run": "Ingrese al menos 13 dígitos para una verificación completa",
    "checksum_valid": "Aprobado",
    "checksum_invalid": "Error",
    "checksum_warning": "Este número no pasó la verificación Luhn y puede contener un error tipográfico. Luhn solo verifica la estructura del número; no prueba que una tarjeta exista o esté activa.",
    "data_disclaimer": "El emisor, el país y el tipo de tarjeta usan datos BIN públicos sin conexión y reglas locales. Pueden cambiar por nuevos rangos o ajustes de producto. Para pagos, riesgo u otros usos críticos, verifica con datos en vivo del emisor o la red de pago. La base global adicional se basa en iannuttall/binlist-data (CC BY 4.0), un conjunto archivado que no es un registro oficial IIN.",
    "type_credit": "Crédito",
    "type_debit": "Débito",
    "type_prepaid": "Prepago",
    "type_unknown": "Desconocido",
    "network_unionpay": "UnionPay​",
    "network_visa": "Visa​",
    "network_mastercard": "Mastercard​",
    "network_amex": "American Express​",
    "network_jcb": "JCB​",
    "network_discover": "Discover​",
    "network_diners": "Diners Club​",
    "network_maestro": "Maestro​",
    "network_unknown": "Desconocido / otro",
    "batch_label": "Números de tarjeta o BINs",
    "batch_placeholder": "Uno por línea, o separar con comas / punto y coma\n622202\n621700\n4111 1111 1111 1111",
    "batch_hint": "Hasta 100 entradas a la vez. Los duplicados se eliminan y las exportaciones nunca contienen números de tarjeta completos sin enmascarar.",
    "run_batch": "Ejecutar búsqueda por lotes",
    "batch_empty": "Ingrese al menos un valor primero.",
    "batch_complete": "Procesadas {count} entradas.",
    "batch_results": "Resultados por lotes",
    "batch_summary": "{total} en total · {matched} emisores encontrados · {valid} pasaron Luhn",
    "copy_table": "Copiar tabla",
    "export_csv": "Exportar CSV",
    "feature_local": "Procesamiento local en el navegador",
    "feature_local_desc": "Carga solo el fragmento BIN necesario de 6 / 8 dígitos y no llama a APIs BIN externas en tiempo real.",
    "feature_validation": "Detección y validación",
    "feature_validation_desc": "La red se detecta a partir de rangos de números; los números completos se verifican por separado con Luhn.",
    "feature_iin": "Soporte de 6 y 8 dígitos",
    "feature_iin_desc": "Muestra tanto el BIN tradicional de 6 dígitos como el IIN moderno de 8 dígitos para comparación.",
    "global_hint": "La base global adicional cubre las regiones de idioma actuales, Latinoamérica, Brasil, Alemania, Rusia y Francia. Solo se usan los primeros 6 / 8 dígitos BIN.",
    "global_loading": "Cargando la base global adicional de BIN…",
    "country": "País / región",
    "country_unknown": "No disponible",
    "card_category": "Nivel / producto",
    "category_unknown": "No disponible",
    "data_source": "Fuente de datos",
    "source_china_local": "Base local de China",
    "source_binlist_data": "Conjunto público binlist-data",
    "source_rules": "Reglas por rango",
    "source_unknown": "Sin coincidencia",
    "batch_loading": "Cargando datos BIN y procesando {count} entradas…",
    "type_charge": "Tarjeta de cargo",
    "network_elo": "Elo​",
    "network_laser": "Laser​",
    "network_solo": "Solo​",
    "network_atm": "ATM​",
    "network_other": "Otro",
    "input_kind": "Tipo de entrada",
    "input_kind_bin6": "BIN de 6 dígitos",
    "input_kind_iin8": "IIN de 8 dígitos / prefijo",
    "input_kind_card": "Número de tarjeta completo",
    "input_kind_partial": "Menos de 6 dígitos",
    "confidence": "Confianza",
    "confidence_high": "Alta: coincidencia por prefijo de 8+ dígitos",
    "confidence_medium": "Media: coincidencia por BIN de 6 dígitos",
    "confidence_low": "Baja: solo por regla o sin coincidencia",
    "result_note": "Nota",
    "note_exact_or_iin": "Coincidencia por prefijo de 8+ dígitos para una identificación más precisa.",
    "note_bin6_match": "Coincidencia por BIN de 6 dígitos; el IIN de 8 dígitos más reciente puede ser más específico.",
    "note_network_only": "Solo se detectó la red de la tarjeta; emisor no encontrado.",
    "note_not_found": "Emisor y red no encontrados. Verifique la entrada o use datos oficiales para decisiones.",
    "filter_all": "Todos",
    "filter_matched": "Emisor coincidente",
    "filter_unmatched": "Sin coincidencia",
    "filter_luhn_failed": "Luhn fallido"
  },
  "gif_frames": {
    "hint": "Suba un archivo GIF para extraer fotogramas",
    "frame_count": "Fotogramas: "
  },
  "code_screenshot": {
    "lang_label": "Lenguaje",
    "bg_label": "Fondo",
    "export": "Exportar PNG"
  },
  "grid_paper": {
    "type_label": "Tipo de cuadrícula",
    "type_tian": "Tian​",
    "type_mi": "Mi​",
    "type_fang": "Cuadrada",
    "type_dot": "Puntos",
    "cell_size_label": "Tamaño de celda (px)",
    "rows_label": "Filas",
    "cols_label": "Columnas",
    "generate": "Generar",
    "export": "Exportar PNG"
  },
  "exchange_rate": {
    "amount_label": "Monto",
    "from_label": "Desde",
    "to_label": "Hasta",
    "convert": "Convertir",
    "disclaimer": "Las tasas de cambio fluctúan y son solo de referencia. Use la cotización de su banco o proveedor de pagos para la liquidación.",
    "swap": "Intercambiar monedas",
    "refresh": "Actualizar tasas",
    "refreshing": "Actualizando…",
    "live_source": "Tasas de referencia diarias de ExchangeRate-API",
    "offline_source": "Tasas de respaldo sin conexión",
    "live_failed": "No se pudieron cargar las tasas en vivo. Se está usando una tasa de respaldo sin conexión desactualizada."
  },
  "hanzi_decompose": {
    "placeholder": "Ingrese caracteres chinos…",
    "decompose": "Descomponer",
    "unknown": "N/A​",
    "done": "Descompuestos {count} caracteres Hanzi.",
    "no_hanzi": "No se encontraron caracteres Hanzi.",
    "copied": "Resultados copiados.",
    "exported": "CSV exportado.",
    "example": "Ejemplo de uso",
    "results_title": "Resultados de descomposición",
    "copy": "Copiar resultados",
    "export_csv": "Exportar CSV",
    "col_char": "Carácter",
    "col_parts": "Partes",
    "col_structure": "Estructura",
    "structure_unknown": "Desconocido",
    "structure_single": "Componente único",
    "structure_pair": "Estructura de dos partes",
    "structure_multi": "Estructura de múltiples partes"
  },
  "audio_editor": {
    "start_label": "Inicio (seg)",
    "end_label": "Fin (seg)",
    "duration": "Duración: ",
    "clip": "Recortar y exportar WAV"
  },
  "csr_generate": {
    "key_size": "Tamaño de clave",
    "generate": "Generar",
    "private_key": "Clave privada"
  },
  "torrent_analyze": {
    "parse_error": "Error al analizar. Confirme que es un archivo .torrent válido.",
    "name_label": "Nombre: ",
    "total_size": "Tamaño total: ",
    "piece_length": "Longitud de pieza: ",
    "info_hash": "Info Hash: ​",
    "files_label": "Archivos: ",
    "trackers": "Trackers: ​",
    "magnet_link": "Enlace Magnet: ",
    "copy": "Copiar"
  },
  "pdf_encrypt": {
    "drop_label": "Elija PDF",
    "drop_desc": "Agregar una contraseña de apertura a un PDF sin cifrar",
    "empty_pdf": "Ningún PDF seleccionado",
    "password_label": "Abra la contraseña",
    "confirm_label": "Confirmar contraseña",
    "btn_encrypt": "Cifrar y descargar",
    "msg_select_first": "Seleccione un archivo PDF primero.",
    "msg_password_required": "Ingrese una contraseña.",
    "msg_password_mismatch": "Las contraseñas no coinciden.",
    "msg_done": "PDF cifrado generado; descarga iniciada.",
    "err_encrypted_or_invalid": "No se puede leer este PDF (cifrado, dañado o no compatible). Si tiene contraseña, use PDF Decrypt primero.",
    "err_failed": "Error al cifrar. Pruebe con Chrome o Edge."
  },
  "heic_to_jpg": {
    "hint": "HEIC/HEIF se decodifica a JPG en su navegador; los archivos no se cargan.",
    "drop_label": "Imágenes HEIC / HEIF",
    "drop_desc": ".heic, .heif — múltiples archivos permitidos",
    "empty": "Ningún archivo HEIC seleccionado",
    "quality_label": "Calidad JPG (0.5–1)",
    "btn_convert": "Convertir a JPG",
    "msg_select": "Seleccione imágenes HEIC/HEIF primero.",
    "msg_done": "Listo. Descarga iniciada.",
    "err_convert": "No se pudo decodificar este archivo HEIC.",
    "err_failed": "Error de conversión. Pruebe con Chrome o Edge."
  },
  "word_count": {
    "hint": "Escriba o pegue texto para contar localmente—no se envía nada a un servidor."
  },
  "age_calc": {
    "birth_label": "Fecha de nacimiento",
    "ref_label": "Fecha de referencia (opcional)",
    "ref_hint": "Dejar vacío para usar hoy",
    "years": "Años",
    "months": "Meses",
    "days": "Días",
    "total_days": "Días totales",
    "err_invalid_birth": "Fecha de nacimiento inválida",
    "err_ref_before_birth": "La fecha de referencia no puede ser anterior a la fecha de nacimiento"
  },
  "random_number": {
    "min": "Mínimo",
    "max": "Máximo",
    "count": "Cantidad (1–500)",
    "integer": "Solo enteros",
    "generate": "Generar",
    "copy": "Copiar todo",
    "output": "Resultados",
    "err_range": "Para enteros, el mínimo no puede ser mayor que el máximo",
    "copied": "Copiado al portapapeles."
  },
  "caesar": {
    "input_text": "Texto de entrada",
    "shift": "Desplazamiento (1-25)",
    "mode": "Modo",
    "encrypt": "Cifrar",
    "decrypt": "Descifrar",
    "run": "Ejecutar",
    "result": "Resultado"
  },
  "des": {
    "input_text": "Texto de entrada / hex",
    "key": "Clave (≥8 bytes)",
    "mode": "Modo",
    "action": "Acción",
    "encrypt": "Cifrar",
    "decrypt": "Descifrar",
    "run": "Ejecutar",
    "result": "Resultado",
    "key_too_short": "La clave debe tener al menos 8 bytes",
    "invalid_hex": "Longitud hex no múltiplo de 16"
  },
  "ripemd": {
    "input_text": "Texto de entrada",
    "compute": "Calcular",
    "result": "Hash RIPEMD-160"
  },
  "bcc_lrc": {
    "input_hex": "Datos hex (separados por espacios)",
    "mode": "Modo de verificación",
    "compute": "Calcular",
    "result": "Resultado",
    "invalid_hex": "Byte hex inválido",
    "no_data": "Ingrese datos"
  },
  "iso_garble": {
    "input": "Texto ilegible",
    "fix": "Corregir",
    "result": "Texto corregido",
    "not_iso": "Contiene caracteres no ISO-8859-1",
    "decode_failed": "Error al decodificar UTF-8"
  },
  "emoji_encode": {
    "input": "Texto de entrada",
    "mode": "Modo de codificación",
    "core_values": "Valores fundamentales",
    "action": "Acción",
    "encode": "Codificación",
    "decode": "Decodificar",
    "run": "Ejecutar",
    "result": "Resultado",
    "decode_failed": "Error de decodificación"
  },
  "code_playground": {
    "preview": "Vista previa"
  },
  "dir_tree": {
    "input": "Rutas de directorio (una por línea)",
    "generate": "Generar",
    "result": "Árbol de directorios"
  },
  "kv_to_code": {
    "input": "Pares clave-valor (clave=valor, uno por línea)",
    "language": "Lenguaje de destino",
    "convert": "Convertir",
    "result": "Código"
  },
  "file_hash": {
    "algorithm": "Algoritmo hash",
    "drop_here": "Suelte el archivo aquí",
    "browse": "Buscar archivo"
  },
  "endianness": {
    "input_hex": "Bytes hex de entrada",
    "from": "Desde endianness",
    "to": "Hasta endianness",
    "convert": "Convertir",
    "result": "Resultado"
  },
  "ones_complement": {
    "decimal": "Entero decimal",
    "bits": "Ancho de bits",
    "compute": "Calcular",
    "original": "Original​",
    "ones": "Complemento a uno",
    "twos": "Complemento a dos"
  },
  "ssl_generate": {
    "key_type": "Tipo de clave",
    "generate": "Generar",
    "public_key": "Clave pública",
    "private_key": "Clave privada",
    "fingerprint": "Huella digital SHA-256"
  },
  "url_batch": {
    "template": "Plantilla de URL (marcador {id} o {param})",
    "params": "Parámetros (uno por línea)",
    "generate": "Generar",
    "result": "Resultado"
  },
  "line_filter": {
    "input": "Texto de entrada",
    "min_len": "Longitud mínima",
    "max_len": "Longitud máxima",
    "action": "Acción",
    "filter": "Filtrar",
    "truncate": "Truncar",
    "pad": "Rellenar",
    "run": "Ejecutar",
    "result": "Resultado"
  },
  "tts": {
    "input": "Texto de entrada",
    "voice": "Voz",
    "rate": "Velocidad",
    "volume": "Volumen",
    "play": "Reproducir",
    "pause": "Pausar",
    "stop": "Detener",
    "speaking": "Hablando..."
  },
  "whois": {
    "domain": "Dominio",
    "query": "Consulta",
    "querying": "Consultando...",
    "result": "Resultado"
  },
  "dns_query": {
    "domain": "Dominio",
    "record_type": "Tipo de registro",
    "query": "Consulta",
    "querying": "Consultando...",
    "result": "Resultado"
  },
  "icp_query": {
    "domain": "Dominio",
    "query": "Consulta",
    "querying": "Consultando...",
    "result": "Resultado",
    "api_error": "Error en la solicitud de API"
  },
  "my_ip": {
    "query": "Consultar mi IP",
    "querying": "Consultando..."
  },
  "browser_fingerprint": {
    "ua": "User-Agent​",
    "language": "Idioma",
    "languages": "Idiomas",
    "platform": "Plataforma",
    "cookies": "Cookies​",
    "do_not_track": "No rastrear",
    "screen_res": "Resolución de pantalla",
    "avail_res": "Resolución disponible",
    "color_depth": "Profundidad de color",
    "pixel_depth": "Profundidad de píxel",
    "device_pixel_ratio": "Proporción de píxel del dispositivo",
    "timezone": "Zona horaria",
    "timezone_offset": "Desplazamiento de zona horaria",
    "max_touch": "Toques máximos",
    "hardware_concurrency": "Núcleos de CPU",
    "memory": "Memoria",
    "canvas": "Huella digital de Canvas"
  },
  "doh": {
    "domain": "Dominio",
    "server": "Servidor DoH",
    "query": "Consulta",
    "querying": "Consultando...",
    "result": "Resultado"
  },
  "placeholder_img": {
    "width": "Ancho",
    "height": "Alto",
    "bg": "Fondo",
    "fg": "Primer plano",
    "text": "Texto",
    "generate": "Generar",
    "download": "Descargar"
  },
  "privacy_policy": {
    "app_name": "Nombre de la aplicación",
    "developer": "Desarrollador",
    "collect_types": "Tipos de datos recopilados",
    "generate": "Generar",
    "result": "Política de privacidad",
    "title": "Política de privacidad",
    "default_types": "Información del dispositivo, ubicación, registros de uso",
    "section1_title": "1. Recopilación de información",
    "section1_body": "{appName} es desarrollado por {developer}. Recopilamos la siguiente información para proporcionar y mejorar los servicios.",
    "section2_title": "2. Uso de la información",
    "section2_body": "{appName} recopila {types} únicamente para el funcionamiento de la aplicación y la mejora de la experiencia, y no venderá a terceros.",
    "section3_title": "3. Seguridad de la información",
    "section3_body": "Tomamos medidas razonables para proteger su información personal.",
    "section4_title": "4. Sus derechos",
    "section4_body": "Usted tiene derecho a acceder, corregir y eliminar su información personal.",
    "section5_title": "5. Contacto",
    "section5_body": "Para consultas, contacte a {developer}."
  },
  "pomodoro": {
    "work": "Trabajando",
    "break": "Descanso",
    "start": "Inicio",
    "pause": "Pausar",
    "reset": "Reiniciar",
    "work_min": "Trabajo(min)",
    "break_min": "Descanso(min)",
    "completed": "Completado"
  },
  "art_qr": {
    "text": "Texto/URL",
    "fg": "Primer plano",
    "bg": "Fondo",
    "style": "Estilo de punto",
    "square": "Cuadrado",
    "circle": "Círculo",
    "generate": "Generar",
    "download": "Descargar"
  },
  "ppi_calc": {
    "diagonal": "Diagonal(pulgadas)",
    "horizontal": "Px horizontal",
    "vertical": "Px vertical",
    "compute": "Calcular",
    "result": "PPI​"
  },
  "mortgage_calc": {
    "principal": "Capital",
    "rate": "Tasa anual(%)",
    "years": "Años",
    "method": "Método",
    "equal_payment": "Pago igualitario",
    "equal_principal": "Capital igualitario",
    "compute": "Calcular",
    "monthly": "Mensual",
    "total": "Total​",
    "interest": "Interés total",
    "first_month": "Primer mes",
    "schedule": "Tabla de amortización completa",
    "period": "Periodo",
    "payment": "Pago",
    "principal_part": "Capital",
    "interest_part": "Interés",
    "remaining": "Saldo",
    "export_csv": "Exportar CSV",
    "invalid": "Ingrese un capital, tasa y plazo válidos.",
    "disclaimer": "Calculado con una tasa anual fija solo para planificación. Su contrato y estado de cuenta del prestamista prevalecen."
  },
  "gb_code": {
    "search": "Buscar carácter o código"
  },
  "solar_lunar": {
    "year": "Año",
    "month": "Mes",
    "day": "Día",
    "convert": "Convertir"
  },
  "world_clock": {},
  "chem_balance": {
    "input": "Ecuación química (p.ej. H2+O2=H2O)",
    "balance": "Balancear"
  },
  "mic_test": {
    "enumerate": "Enumerar dispositivos",
    "default": "Dispositivo predeterminado",
    "device": "Dispositivo",
    "status_label": "Estado",
    "status_idle": "Inactivo",
    "status_granted": "Concedido",
    "status_denied": "Denegado",
    "status_recording": "Grabando",
    "status_playing": "Reproduciendo",
    "record": "Iniciar grabación",
    "stop": "Detener grabación",
    "play": "Reproducir grabación",
    "download": "Descargar grabación",
    "duration": "Duración",
    "volume": "Volumen"
  },
  "keyboard_test": {
    "hint": "Presione cualquier tecla en su teclado para probar",
    "current": "Tecla actual",
    "history": "Historial de teclas"
  },
  "screen_test": {
    "color_red": "Rojo",
    "color_green": "Verde",
    "color_blue": "Azul",
    "color_white": "Blanco",
    "color_black": "Negro",
    "click_exit": "Haga clic o presione ESC para salir de pantalla completa",
    "screen_info": "Información de pantalla",
    "resolution": "Resolución",
    "available": "Disponible",
    "pixel_ratio": "Proporción de píxel",
    "esc_hint": "Presione ESC para salir del modo de pantalla completa"
  },
  "pfx_to_pem": {
    "select_file": "Seleccionar archivo PFX/P12",
    "password": "Contraseña",
    "parse": "Analizar",
    "parsing": "Analizando...",
    "cert_pem": "Certificado PEM",
    "key_pem": "Clave privada PEM",
    "download": "Descargar",
    "parse_error": "El análisis falló",
    "no_content": "No se encontró certificado ni clave privada",
    "forge_required": "Se requiere la biblioteca node-forge"
  },
  "http_request": {
    "headers": "Encabezados",
    "add_header": "Agregar encabezado",
    "body": "Cuerpo",
    "send": "Enviar",
    "sending": "Enviando...",
    "cors_warning": "Nota: La política CORS del navegador puede limitar algunas solicitudes; solo se admiten endpoints con CORS habilitado",
    "status": "Estado",
    "status_text": "Texto de estado",
    "time": "Tiempo",
    "response_headers": "Encabezados de respuesta",
    "response_body": "Cuerpo de respuesta"
  },
  "doodle": {
    "color": "Color​",
    "size": "Tamaño de pincel",
    "eraser": "Borrador",
    "undo": "Deshacer",
    "clear": "Borrar",
    "download": "Descargar PNG",
    "reset": "Reiniciar lienzo"
  },
  "modpow": {
    "base": "Base​",
    "exponent": "Exponente",
    "modulus": "Módulo",
    "calc": "Calcular",
    "result": "Resultado:",
    "err_modulus_zero": "El módulo no puede ser 0",
    "err_negative_exp": "El exponente no puede ser negativo",
    "err_invalid": "Entrada inválida, ingrese números enteros",
    "note": "La exponenciación modular se usa ampliamente en cifrado RSA, intercambio de claves Diffie-Hellman, criptografía de curva elíptica, etc. Esta herramienta usa BigInt con el algoritmo de cuadrado-y-multiplicar, soportando enteros arbitrariamente grandes."
  },
  "bit_reverse": {
    "input_label": "Entero positivo de entrada",
    "width_label": "Ancho de bits",
    "calc": "Calcular",
    "step_original": "Binario original:",
    "step_reversed": "Binario invertido:",
    "result_dec": "Resultado (decimal):",
    "result_hex": "Resultado (hex):",
    "err_negative": "Ingrese un entero no negativo",
    "err_invalid": "Entrada inválida"
  },
  "punctuation": {
    "cn2en": "CN → EN​",
    "en2cn": "EN → CN​",
    "input_label": "Texto de entrada",
    "convert": "Convertir",
    "output_label": "Salida",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "leap_year": {
    "mode_single": "Año individual",
    "mode_range": "Rango",
    "year_label": "Año",
    "start_label": "Año de inicio",
    "end_label": "Año de fin",
    "check": "Verificar",
    "is_leap": "El año {year} es bisiesto",
    "not_leap": "El año {year} no es bisiesto",
    "range_result": "{count} años bisiestos entre {start} y {end}:",
    "err_invalid": "Ingrese un año válido",
    "err_range": "Ingrese años de inicio y fin válidos",
    "rule": "Regla de año bisiesto: un año divisible por 4 es bisiesto, a menos que sea divisible por 100 pero no por 400. Por ejemplo: 2000 es bisiesto, 1900 no lo es, 2024 sí lo es."
  },
  "reverse": {
    "mode_char": "Inversión de caracteres",
    "mode_line": "Inversión de líneas",
    "input_label": "Texto de entrada",
    "action": "Invertir",
    "output_label": "Salida",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "reaction_test": {
    "click_start": "Haga clic para iniciar",
    "wait_green": "Espere el verde…",
    "click_now": "¡Haga clic ahora!",
    "your_time": "Su tiempo de reacción: {ms} ms",
    "too_early": "¡Muy pronto! Espere la señal verde.",
    "try_again": "Inténtelo de nuevo",
    "stats_title": "Estadísticas",
    "avg": "Promedio",
    "best": "Mejor",
    "worst": "Peor",
    "history_title": "Historial (últimos 10)"
  },
  "ipv4_ipv6": {
    "input_label": "Ingrese dirección",
    "mode_auto": "Automático",
    "mode_ipv4": "IPv4​",
    "mode_ipv6": "IPv6​",
    "invalid_ipv4": "Dirección IPv4 inválida",
    "invalid_ipv6": "Dirección IPv6 inválida",
    "invalid_input": "Dirección de entrada inválida",
    "mapped": "IPv6 mapeada",
    "mapped_hex": "IPv6 mapeada (Hex)",
    "compatible": "Compatible con IPv4",
    "compatible_hex": "Compatible con IPv4 (Hex)",
    "six_to_four": "Dirección 6to4",
    "expanded": "Expansión completa",
    "compressed": "Comprimida",
    "extracted_ipv4": "IPv4 extraída",
    "no_ipv4_mapping": "Esta dirección IPv6 no contiene un mapeo IPv4",
    "batch_placeholder": "Una IPv4 o IPv6 por línea\n192.168.1.1\n::ffff:192.168.1.1\n2002:c0a8:0101::",
    "first_line_hint": "La primera línea muestra la conversión detallada; múltiples líneas generan la tabla por lotes abajo.",
    "batch_results": "Resultados de análisis por lotes",
    "copy_batch": "Copiar resultados por lotes",
    "col_input": "Entrada",
    "col_type": "Tipo",
    "col_output": "Resultado convertido/extraído",
    "col_note": "Nota",
    "invalid": "Inválido",
    "batch_note_ipv4": "IPv6 mapeada a IPv4 generada para registros y configuración de doble pila.",
    "batch_note_extractable": "Esta IPv6 contiene información IPv4 extraíble.",
    "batch_note_no_mapping": "IPv6 regular no contiene IPv4 y no se puede convertir directamente de vuelta."
  },
  "code_formatter": {
    "language": "Lenguaje",
    "indent_size": "Tamaño de sangría",
    "wrap_length": "Longitud de ajuste",
    "input_label": "Código de entrada",
    "input_placeholder": "Pegar código…",
    "format": "Formato",
    "output_label": "Salida formateada",
    "copy": "Copiar",
    "copied": "Copiado"
  },
  "port_check": {
    "host_label": "Nombre de host / IP",
    "port_label": "Puerto",
    "check": "Verificar",
    "check_common": "Verificar puertos comunes",
    "th_port": "Puerto",
    "th_service": "Servicio",
    "th_status": "Estado",
    "status_checking": "Verificando…",
    "status_open": "Abierto",
    "status_closed": "Cerrado",
    "status_timeout": "Tiempo agotado",
    "status_error": "Error​",
    "limitation_note": "Nota: Debido a las restricciones de seguridad CORS del navegador, los resultados de verificación de puertos son solo de referencia. Esto usa fetch en modo no-cors; una respuesta opaca sugiere que el servicio puede estar respondiendo, pero no se puede confirmar. Una detección más precisa requiere herramientas del lado del servidor."
  },
  "auto_refresh": {
    "url_label": "URL de destino",
    "interval_label": "Intervalo de actualización",
    "seconds": "segundos (mín. 5s)",
    "start": "Inicio",
    "stop": "Detener",
    "countdown": "Cuenta regresiva",
    "total_refreshes": "Actualizaciones",
    "last_refresh": "Última actualización",
    "preview": "Vista previa de página",
    "bookmarklet_title": "Bookmarklet​",
    "bookmarklet_desc": "Arrastre el botón abajo a su barra de marcadores para usar la auto-actualización en cualquier página.",
    "bookmarklet_btn": "Bookmarklet de auto-actualización"
  },
  "text_to_html_table": {
    "inputLabel": "Texto de entrada (CSV/TSV)",
    "placeholder": "Nombre,Edad,Ciudad\nAlice,25,Beijing\nBob,30,Shanghai",
    "delimiter": "Delimitador",
    "hasHeader": "Fila de encabezado",
    "border": "Borde",
    "padding": "Relleno de celda",
    "className": "Nombre de clase CSS",
    "htmlCode": "Código HTML",
    "copy": "Copiar código",
    "copied": "Copiado",
    "preview": "Vista previa"
  },
  "font_preview": {
    "textLabel": "Texto de vista previa",
    "fontSize": "Tamaño de fuente",
    "customFont": "Fuente personalizada"
  },
  "symbols": {
    "search": "Buscar",
    "searchPlaceholder": "Buscar símbolo o nombre…"
  },
  "rc4": {
    "key": "Clave",
    "mode": "Modo",
    "encrypt": "Cifrar",
    "decrypt": "Descifrar",
    "plaintext": "Texto sin formato",
    "ciphertext": "Texto cifrado",
    "inputEnc": "Codificación de entrada",
    "outputEnc": "Codificación de salida",
    "result": "Resultado",
    "keyRequired": "Se requiere clave",
    "inputRequired": "Se requiere entrada"
  },
  "clipboard_viewer": {
    "read": "Leer portapapeles",
    "hint": "Requiere permiso del navegador. Si se deniega, use el área de pegado abajo.",
    "pasteArea": "Área de pegado (Ctrl+V)",
    "pasteItems": "Contenido pegado"
  },
  "svg_editor": {
    "tool": "Herramienta",
    "add": "Agregar forma",
    "properties": "Propiedades",
    "delete": "Eliminar selección",
    "svgCode": "Código SVG",
    "copy": "Copiar",
    "copied": "Copiado"
  }
}
