{
	"api_kicker": "API para desarrolladores",
	"api_title": "Crea actividades desde tu propio sistema",
	"api_intro": "Un POST por tipo de actividad. Envía tu contenido como JSON y recibe una actividad en tu cuenta de Puzzel.org y una URL que puedes dar a los jugadores o colocar en un iframe.",
	"api_search_placeholder": "Buscar endpoints, campos y ajustes",
	"api_search_results": "coinciden en esta página",
	"api_search_empty": "Nada en esta página coincide con eso. Prueba con el nombre de un endpoint, un campo como activity_key o un código de estado.",
	"api_search_clear": "Borrar búsqueda",
	"api_nav_guide": "Primeros pasos",
	"api_nav_endpoints": "Endpoints",
	"api_toc_label": "En esta página",
	"api_hero_base_label": "URL base",
	"api_hero_method_label": "Método",
	"api_hero_method_value": "POST, cuerpo JSON",
	"api_hero_auth_label": "Autenticación",
	"api_hero_auth_value": "Clave + email en el cuerpo",
	"api_hero_limit_label": "Cuota",
	"api_hero_limit_value": "[limit] actividades al día",
	"api_hero_count_label": "Endpoints",
	"api_hero_count_value": "[count] tipos de actividad",
	"api_s_quickstart_title": "Tu primera petición",
	"api_s_quickstart_body": "Envía una petición POST con tu clave de API, correo y contenido en el cuerpo JSON. No necesitas instalar nada ni establecer una conexión previa. La respuesta incluye la clave de la nueva actividad y la URL para jugar.",
	"api_s_quickstart_note": "Todos los ejemplos de esta página son peticiones completas y ejecutables. Sustituye la clave y el contenido por los tuyos y funcionan tal cual.",
	"api_s_auth_title": "Autenticación",
	"api_s_auth_body": "Envía la clave de API y el correo en el cuerpo JSON de cada petición. No necesitas cabeceras de autenticación ni un bearer token. La clave debe pertenecer a la cuenta con ese correo.",
	"api_s_auth_where": "Tu clave está en la sección de cuenta de tu panel, detrás de Mostrar.",
	"api_s_auth_where_link": "Abrir mi clave de API",
	"api_s_auth_premium": "Las claves de API se entregan cuando empieza una suscripción, así que una cuenta gratis todavía no tiene una.",
	"api_s_auth_plans": "Ver los planes",
	"api_s_auth_secret": "Trata la clave como una contraseña. Crea y sobrescribe actividades en tu cuenta, así que mantenla en el servidor y fuera de cualquier cosa que un navegador pueda leer.",
	"api_prefill_kicker": "Ejemplos",
	"api_prefill_label": "Rellenar los ejemplos con mi propia clave de API",
	"api_prefill_signed_out": "Inicia sesión y tu clave aparecerá en todos los ejemplos de esta página.",
	"api_prefill_sign_in": "Iniciar sesión",
	"api_prefill_none": "Esta cuenta todavía no tiene clave de API.",
	"api_prefill_warning": "Ahora todos los ejemplos contienen tu clave real. No pegues ninguno en un chat, una incidencia o un repositorio público.",
	"api_s_request_title": "El cuerpo de la petición",
	"api_s_request_body": "Todos los endpoints usan los mismos cinco campos básicos. El campo de contenido depende del tipo de actividad: normalmente es un array de elementos, aunque algunos reciben una oración o una imagen. Para sudoku no necesitas enviar contenido.",
	"api_s_request_settings": "settings es un objeto con opciones por endpoint. Cuáles lee cada endpoint se indica junto a él más abajo; cualquier otra cosa que pongas ahí se ignora.",
	"api_col_field": "Campo",
	"api_col_type": "Tipo",
	"api_col_notes": "Qué hace",
	"api_col_status": "Estado",
	"api_col_meaning": "Qué significa",
	"api_required": "obligatorio",
	"api_optional": "opcional",
	"api_default_label": "Por defecto",
	"api_allowed_label": "Uno de",
	"api_in_settings": "en settings",
	"api_f_account_api_key": "La clave de API de tu cuenta. Va en el cuerpo, no en una cabecera.",
	"api_f_email": "La dirección con la que inicia sesión tu cuenta de Puzzel.org. La clave solo es válida junto con ella.",
	"api_f_title": "El nombre que recibe la actividad en tu panel. Si lo omites, el endpoint usa su propio nombre por defecto.",
	"api_f_language": "Solo determina el idioma de la URL que recibes; no traduce nada de lo que envías. La sopa de letras también lo lee para cambiar sus letras de relleno al árabe cuando es \"ar\".",
	"api_f_activity_key": "Omítelo para crear una actividad nueva. Pasa la clave de una que ya sea tuya y esa actividad se reconstruye en su lugar.",
	"api_f_sentence_cryptogram": "La oración que se va a cifrar. Los jugadores la descifran carácter a carácter.",
	"api_f_sentence_calculation": "La oración que los jugadores descubren al resolver las operaciones.",
	"api_f_image": "URL absoluta de la imagen que se va a recortar. Se envía en el nivel superior, no dentro de settings.",
	"api_f_image_setting": "URL absoluta de la imagen que se va a desordenar. A diferencia del rompecabezas, esta va dentro de settings.",
	"api_s_response_title": "Qué recibes de vuelta",
	"api_s_response_body": "Una llamada correcta responde 200 con la clave de la nueva actividad y la URL en la que se juega. Cualquier otra cosa responde con success en false y una única cadena de error.",
	"api_response_success": "Éxito",
	"api_response_error": "Error",
	"api_s_response_urls": "La url que recibes es la vista para insertar. Cambia embed por play para abrirla a pantalla completa, o por build para abrirla en el editor; la clave después de p= es la misma.",
	"api_s_updating_title": "Crear frente a actualizar",
	"api_s_updating_body": "Envía activity_key para reconstruir una actividad existente. Se sustituye el contenido y se actualizan el nombre y la marca de versión. La clave no cambia, así que los enlaces compartidos y las actividades insertadas siguen funcionando. Se conservan los resultados, la carpeta y los ajustes que el endpoint no modifica.",
	"api_s_updating_own": "Solo puedes actualizar actividades que pertenezcan a tu propia cuenta. La clave de otra persona responde 403.",
	"api_s_updating_name": "title se aplica en cada actualización, incluido su valor por defecto: si lo omites, la actividad pasa a llamarse con el nombre por defecto de ese endpoint.",
	"api_s_updating_settings": "Los bloques de ajustes que un endpoint escribe por sí mismo se reescriben desde cero, así que una actualización también los restablece a los valores que envías, o a los valores por defecto del endpoint.",
	"api_s_updating_quota": "Una actualización cuesta lo mismo que una creación: una llamada de la cuota de hoy.",
	"api_s_limits_title": "Límite de peticiones",
	"api_s_limits_body": "Cada llamada correcta cuenta, tanto creaciones como actualizaciones. Si te pasas, la siguiente petición responde 429 hasta que el contador se reinicia.",
	"api_s_limits_counter": "[limit] actividades por cuenta y día",
	"api_s_limits_reset": "El contador se pone a cero una vez al día mediante una tarea programada, no en una ventana móvil de 24 horas.",
	"api_s_errors_title": "Errores",
	"api_s_errors_body": "Los errores llegan siempre como JSON con los mismos dos campos, nunca como una página HTML. La cadena error está escrita para que la lea una persona: indica el campo o el límite que falló.",
	"api_err_400": "Falta algo en el cuerpo, está mal formado o fuera de rango. El mensaje indica el campo.",
	"api_err_401": "El email es desconocido, o la clave no pertenece a esa cuenta.",
	"api_err_403": "La activity_key que enviaste pertenece a otra cuenta.",
	"api_err_429": "La cuota de hoy está agotada. Se reinicia una vez al día.",
	"api_err_500": "El generador no pudo construir un puzle con lo que enviaste; normalmente por muy pocas palabras, o por palabras que no encajan entre sí.",
	"api_endpoints_title": "Endpoints",
	"api_endpoints_intro": "Una ruta por tipo de actividad, todas POST, todas bajo la misma URL base. Cada una indica el contenido que necesita, los ajustes que lee y una petición que puedes ejecutar.",
	"api_group_words": "Palabras y letras",
	"api_group_cards": "Tarjetas y parejas",
	"api_group_questions": "Preguntas y respuestas",
	"api_group_text": "Oraciones y números",
	"api_group_images": "Imágenes",
	"api_ep_content_label": "Contenido",
	"api_ep_settings_label": "Ajustes que lee",
	"api_ep_settings_none": "Este endpoint no lee ningún ajuste.",
	"api_ep_example_label": "Petición de ejemplo",
	"api_ep_notes_label": "Conviene saber",
	"api_ep_min_items": "Al menos [count] en items",
	"api_ep_no_items": "No acepta items",
	"api_ep_default_title": "Usa por defecto el nombre “[title]”",
	"api_copy": "Copiar",
	"api_copied": "Copiado",
	"api_toast_copied": "Copiado al portapapeles",
	"api_ep_open_builder": "Abrir el editor",
	"api_ep_back_to_top": "Volver arriba",
	"api_e_crossword": "Entrelaza tus respuestas en una cuadrícula y numera las definiciones por ti.",
	"api_c_crossword": "Un array de palabras. Cada entrada combina la respuesta con la definición que la señala.",
	"api_note_crossword_length": "Las respuestas de menos de dos caracteres se descartan antes de construir la cuadrícula, y al menos dos tienen que sobrevivir a ese filtro.",
	"api_note_crossword_layout": "Las respuestas se pasan a mayúsculas y el generador tiene veinte intentos para encajarlas. Si no consigue colocar ni una sola palabra, la llamada responde 500.",
	"api_e_wordseeker": "Esconde tus palabras en una cuadrícula de letras, en las direcciones y con la forma que elijas.",
	"api_c_wordseeker": "Un array de palabras. El texto de la definición se convierte en la lista de palabras con la que trabajan los jugadores.",
	"api_note_wordseeker_length": "Las respuestas de menos de dos caracteres se descartan, y todas las respuestas se pasan a mayúsculas antes de entrar en la cuadrícula.",
	"api_note_wordseeker_arabic": "La cuadrícula se rellena con letras latinas salvo que language sea \"ar\", que cambia el relleno al árabe.",
	"api_set_wordseeker_hidden_solution": "Las letras sobrantes forman esta palabra. Establecerla también indica al generador que encaje primero la solución en lugar de meter tantas palabras como pueda.",
	"api_set_wordseeker_directions": "En qué direcciones puede ir una palabra. Si lo omites, las palabras solo van hacia el este, el sureste y el sur.",
	"api_set_wordseeker_template": "Recorta la cuadrícula con una forma en lugar de dejarla cuadrada.",
	"api_e_acrostic": "Apila tus respuestas para que una columna forme una palabra oculta.",
	"api_c_acrostic": "Un array de palabras. Entre todas tienen que aportar cada letra de la palabra oculta.",
	"api_set_acrostic_hidden_solution": "La palabra que forma la columna resaltada. Este endpoint no funciona sin ella.",
	"api_note_acrostic_letters": "Si las respuestas no pueden aportar las letras que necesita la solución, la llamada responde 500 en lugar de guardar una cuadrícula a medio construir.",
	"api_note_acrostic_order": "El generador reordena tus respuestas para que la columna funcione, así que el orden que envías no es el orden que ven los jugadores.",
	"api_e_word-scramble": "Revuelve las letras de cada respuesta para que los jugadores las ordenen.",
	"api_c_word-scramble": "Un array de palabras. La definición se muestra junto a las letras revueltas.",
	"api_set_scramble_hidden_solution": "Una palabra extra opcional que los jugadores introducen cuando el resto está resuelto.",
	"api_note_scramble_random": "Las actividades creadas a través de la API siempre tienen activado el ajuste de orden aleatorio, así que el orden que envías no es el orden que reciben los jugadores.",
	"api_e_hangman": "Convierte tus palabras o frases en rondas de adivinar letras.",
	"api_c_hangman": "Un array de palabras o frases cortas. La definición es la pista que ven los jugadores.",
	"api_e_wordle": "Crea un juego de adivinar la palabra con cada palabra que envías.",
	"api_c_wordle": "Un array de palabras. Los jugadores tienen una ronda por palabra.",
	"api_note_wordle_dictionary": "Por defecto, se comprueba que las palabras introducidas estén en el diccionario. Desactiva esta opción en el editor si usas nombres propios o palabras inventadas.",
	"api_e_typing-practice": "Convierte oraciones en ejercicios de mecanografía.",
	"api_c_typing-practice": "Un array de palabras u oraciones para teclear. El campo de definición sirve también como instrucción.",
	"api_e_wheel-of-fortune": "Llena una ruleta giratoria con tus propios segmentos.",
	"api_c_wheel-of-fortune": "Un array de segmentos. Cada respuesta se convierte en una porción.",
	"api_note_wheel_outcome": "Se crea con “mostrar el resultado solo en la ruleta”, así que el resultado se lee en la ruleta en lugar de anunciarse al lado.",
	"api_e_memory": "Tarjetas boca abajo para darles la vuelta y emparejarlas.",
	"api_c_memory": "Un array de parejas. Cada pareja contiene las dos tarjetas que van juntas.",
	"api_note_cards_media": "Una tarjeta es un objeto con un type y un value. Usa \"text\" para palabras, o \"image\", \"audio\", \"youtube\" o \"link\" con una URL en value, y añade alt para una descripción.",
	"api_e_matching-pairs": "Dos columnas de tarjetas para arrastrar y juntar.",
	"api_c_matching-pairs": "Un array de parejas. La primera tarjeta de cada pareja cae en un lado y su compañera en el otro.",
	"api_e_flash-cards": "Tarjetas de dos caras para ir pasando.",
	"api_c_flash-cards": "Un array de tarjetas. La primera tarjeta es el anverso, la segunda el reverso.",
	"api_note_flashcards_sides": "El endpoint guarda tantas tarjetas como envíes, así que envía exactamente dos por entrada: primero el anverso, luego el reverso.",
	"api_e_categorize": "Tarjetas para clasificar en la categoría a la que pertenecen.",
	"api_c_categorize": "Un array de categorías, cada una con un nombre y las tarjetas que le pertenecen.",
	"api_note_categorize_name": "Una categoría enviada sin nombre se guarda como “Untitled Category”, así que envía siempre uno.",
	"api_e_reorder": "Una secuencia que los jugadores tienen que volver a ordenar.",
	"api_c_reorder": "Un array de secuencias. Cada una contiene sus tarjetas en el orden correcto.",
	"api_note_reorder_order": "El orden que envías se guarda como el orden correcto: el número uno primero.",
	"api_e_quiz": "Preguntas de opción múltiple y abiertas, puntuadas sobre la marcha.",
	"api_c_quiz": "Un array de preguntas. Las preguntas de opción múltiple llevan sus respuestas; las abiertas llevan la respuesta que aceptas.",
	"api_note_question_types": "question_type es \"multiple_choice\", donde la opción correcta lleva isCorrect en true, o \"open_answer\", que usa correct_answer en su lugar. Si se omite, se trata como opción múltiple.",
	"api_note_quiz_settings": "El endpoint del quiz pasa settings directamente como bloques de ajustes de la actividad, así que no es un sitio para opciones sueltas: ajusta el quiz en el editor después.",
	"api_e_board-game": "Un tablero para recorrer a toda velocidad, con tus preguntas en las casillas.",
	"api_c_board-game": "Un array de preguntas, exactamente con la misma forma que acepta el endpoint del quiz.",
	"api_set_board_tiles": "Cuántas casillas tiene el tablero. Entre 10 y 75.",
	"api_set_board_mode": "Si los jugadores compiten por llegar a la meta o recogen objetos por el camino.",
	"api_e_cryptogram": "Convierte una oración en un código que descifrar, carácter a carácter.",
	"api_c_cryptogram": "Una oración, en el campo sentence. Este endpoint no acepta items.",
	"api_note_cryptogram_no_items": "Cualquier cosa que envíes en items se ignora: el puzle se construye solo a partir de la oración.",
	"api_set_cryptogram_helpers": "Qué caracteres se dan gratis como punto de partida: ninguno, los más comunes, las vocales o los que indiques tú.",
	"api_set_cryptogram_character_list": "El alfabeto con el que se construye el cifrado. Si se deja vacío, el cifrado elige el suyo.",
	"api_set_cryptogram_extra_letters": "Los caracteres que se dan cuando helpers es \"custom\". Se ignora en los demás modos de ayuda.",
	"api_set_cryptogram_hide_unused": "Deja fuera de la clave los caracteres que la oración nunca usa.",
	"api_e_calculation": "Esconde una oración detrás de operaciones: resuelve la operación y revela la letra.",
	"api_c_calculation": "Una oración, en el campo sentence. Este endpoint no acepta items.",
	"api_set_calc_difficulty": "El resultado más alto que puede tener una operación.",
	"api_set_calc_operators": "Qué operaciones pueden aparecer. x es multiplicar, : es dividir.",
	"api_set_calc_max_operations": "Cuántas operaciones puede encadenar un mismo cálculo.",
	"api_set_calc_number_difficulty": "Limita los números individuales dentro de una operación. Desde 5 hasta 1000.",
	"api_note_calculation_fit": "Si las restricciones son demasiado estrictas para codificar la oración, la llamada responde 400 pidiéndote que las relajes en lugar de guardar un puzle parcial.",
	"api_e_sudoku": "Genera una cuadrícula resuelta y luego quita números.",
	"api_c_sudoku": "Nada. Todo el puzle sale de sus dos ajustes.",
	"api_note_sudoku_no_items": "No envíes items ni sentence: size y difficulty son toda la entrada.",
	"api_note_sudoku_difficulty_sizes": "El editor solo ofrece la dificultad para 2x3, 3x3 y 3x4. La API la aplica a todos los tamaños, incluidos 2x2 y 4x4.",
	"api_set_sudoku_size": "El tamaño de un bloque, escrito como filas por columnas: 3x3 da la cuadrícula clásica de 9x9. El endpoint solo comprueba que se pueda leer como dos números, así que quédate con los tamaños que ofrece el editor.",
	"api_set_sudoku_difficulty": "Cuántos números quedan en el tablero para empezar.",
	"api_e_jigsaw": "Corta una imagen en piezas para volver a montarla arrastrándolas.",
	"api_c_jigsaw": "Una URL de imagen, en el campo image. Este endpoint no acepta items.",
	"api_note_jigsaw_grid": "La API siempre crea un rompecabezas de 4 por 4. El número de piezas, las piezas irregulares y los bordes rectos son ajustes del editor: enviar rows o columns aquí no hace nada.",
	"api_note_image_reachable": "La URL se guarda tal como la enviaste y el archivo nunca se copia, así que tiene que seguir siendo accesible públicamente mientras se juegue la actividad.",
	"api_e_slidingpuzzle": "Desordena una imagen en fichas que se deslizan hasta su sitio.",
	"api_c_slidingpuzzle": "Una URL de imagen, dentro de settings. Este endpoint no acepta items.",
	"api_note_sliding_image_slot": "A diferencia del rompecabezas, este endpoint lee su imagen de settings.image. Un campo image en el nivel superior se ignora y la llamada responde 400.",
	"api_help_title": "¿Algo no funciona como debería?",
	"api_help_body": "Envíanos la petición que has usado y el error que recibiste. Te responderá la persona que creó la API.",
	"api_help_cta": "Escribir a soporte",
	"api_int_kicker": "Integraciones para desarrolladores",
	"api_int_title": "Conecta Puzzel a tu propia plataforma",
	"api_int_intro": "Puzzel puede entregar el resultado de un jugador directamente a otro sistema —su puntuación, hasta dónde llegó, qué respondió— sin que ese sistema tenga que ser un LMS completo. Esta página reúne todos los canales que existen: qué sale, cuándo sale y lo mínimo que tienes que construir para recibirlo.",
	"api_int_hero_out_label": "Los resultados salen mediante",
	"api_int_hero_out_value": "Un webhook, o un mensaje a la página que rodea la actividad",
	"api_int_hero_in_label": "Tu página puede",
	"api_int_hero_in_value": "Iniciar la sesión del jugador y reiniciar la actividad",
	"api_int_hero_where_label": "Se activa",
	"api_int_hero_where_value": "Por actividad, en Desarrollador dentro del editor",
	"api_int_hero_plan_label": "Incluido con",
	"api_int_hero_plan_value": "Un plan de pago — estos ajustes están desactivados en una cuenta gratis",
	"api_int_search_placeholder": "Buscar canales, campos y ejemplos",
	"api_int_search_empty": "Nada en esta página coincide con eso. Prueba con un canal como webhook o postMessage, o un campo como progress.",
	"api_int_nav_channels": "Canales",
	"api_int_s_choose_title": "¿Qué canal necesitas?",
	"api_int_s_choose_body": "De una actividad pueden salir tres cosas, y puede entrar una. Cuál te conviene depende de una sola pregunta: ¿el jugador está dentro de tu página, o en un sitio completamente distinto?",
	"api_int_choose_out": "Sale de Puzzel",
	"api_int_choose_in": "Entra en Puzzel",
	"api_int_choose_when": "Úsalo cuando",
	"api_int_choose_needs": "Necesitas",
	"api_int_choose_setting": "Ajuste",
	"api_int_ch_webhook_name": "Webhook de resultados",
	"api_int_ch_webhook_summary": "Cada resultado guardado se envía por POST, como JSON, a una URL de tu propiedad.",
	"api_int_ch_webhook_when": "El jugador puede estar en cualquier sitio —un enlace compartido, un código QR, la página de otra persona— y quieres el resultado en tu propia base de datos.",
	"api_int_ch_webhook_needs": "Un endpoint HTTPS que acepte un POST de origen cruzado.",
	"api_int_ch_parent_name": "Resultados a la página que la rodea",
	"api_int_ch_parent_summary": "El mismo JSON, enviado a la página que inserta la actividad en lugar de a un servidor.",
	"api_int_ch_parent_when": "Insertas la actividad en la página de tu propio curso y esa página puede hacer algo con el resultado.",
	"api_int_ch_parent_needs": "Un iframe en tu página y un listener de mensajes. Sin servidor, sin CORS.",
	"api_int_ch_completion_name": "Señal de finalización",
	"api_int_ch_completion_summary": "Un mensaje cuando el jugador termina, que no lleva más información que ese hecho.",
	"api_int_ch_completion_when": "Solo quieres saber si ha terminado —para marcar la lección como hecha, desbloquear la siguiente o mostrar tu propia pantalla.",
	"api_int_ch_completion_needs": "Un iframe en tu página y un listener de mensajes.",
	"api_int_ch_trigger_name": "Reiniciar desde tu página",
	"api_int_ch_trigger_summary": "Tu página le indica a la actividad insertada que borre las respuestas del jugador y empiece de nuevo.",
	"api_int_ch_trigger_when": "Tienes tu propio botón «intentar de nuevo» fuera de la actividad.",
	"api_int_ch_trigger_needs": "Un iframe en tu página. El mensaje solo se acepta desde la página que hace la inserción.",
	"api_int_s_webhook_title": "Webhook de resultados",
	"api_int_s_webhook_body": "Activa «Enviar los resultados a un webhook» en el editor y dale una URL. A partir de ahí, cada vez que se guarda el progreso del jugador, su navegador envía por POST el resultado completo a esa URL como JSON.",
	"api_int_webhook_steps_title": "Configurarlo",
	"api_int_webhook_step_1": "Abre la actividad en el editor y ve al menú Desarrollador.",
	"api_int_webhook_step_2": "Activa «Enviar los resultados a un webhook» y pega tu endpoint en el campo de debajo. Tiene que ser una URL completa —un dominio sin más se rechaza— y tiene que ser https, porque el navegador bloquea una llamada http sin más hecha desde una página servida por https.",
	"api_int_webhook_step_3": "Juega la actividad una vez tú mismo. El primer POST llega en cuanto respondes algo.",
	"api_int_webhook_receiver": "Un receptor, de principio a fin",
	"api_int_webhook_timing_title": "Se dispara mientras juegas, no solo al final",
	"api_int_webhook_timing_body": "Sale un resultado cada vez que se guarda la entrada: tras una pausa al escribir, cuando se coloca una carta, cuando el reloj se detiene, y una vez más cuando termina la actividad. Un crucigrama largo son varias decenas de llamadas, no una sola —así que escribe tu handler como un upsert con clave en playerUid y activityKey, no como una inserción. Cada llamada lleva el estado completo, así que la más reciente siempre reemplaza a la anterior, y una llamada que se pierde queda cubierta por la siguiente.",
	"api_int_webhook_finished_title": "Distinguir un final de un simple guardado",
	"api_int_webhook_finished_body": "progress es un porcentaje: 100 significa que la actividad está completa. Algunos tipos pueden terminar sin llegar a ese valor —un quiz respondido hasta el final, un campo de solución resuelto— y en su lugar llevan hasAlternateCompletion. Trata cualquiera de los dos como terminado.",
	"api_int_webhook_cors_title": "Lo envía el navegador del jugador",
	"api_int_webhook_cors_body": "El POST llega desde la pestaña donde se está jugando la actividad, no desde un servidor de Puzzel. La mayoría de los endpoints preparados para recibir webhooks ya lo aceptan así. Si el tuyo nunca ve ninguna solicitud, esta es la razón: el navegador pide permiso antes, así que responde a la solicitud OPTIONS previa con una cabecera Access-Control-Allow-Origin, y el POST real llega después.",
	"api_int_webhook_trust_title": "Trata el payload como una afirmación, no como una prueba",
	"api_int_webhook_trust_body": "La solicitud no lleva firma, y viene de un navegador que no controlas, así que cualquiera que mire la página puede enviarte una también. Eso está bien para rellenar una barra de progreso o un panel. Para cualquier cosa que no dejarías fijar a un estudiante por su cuenta —una calificación que cuenta, un certificado, un pago— compáralo con los resultados de tu propio panel de Puzzel, o deja que los conectores de calificación del LMS se encarguen de la puntuación.",
	"api_int_s_parent_title": "Resultados a la página que la rodea",
	"api_int_s_parent_body": "Si insertas la actividad, puedes hacer que ese mismo JSON se envíe a tu propia página en lugar de a un servidor. Activa «Enviar los resultados a la página principal» y escucha el mensaje. Nada sale del navegador, así que no hay ningún endpoint que construir ni CORS del que preocuparse.",
	"api_int_parent_origin_title": "Comprueba de dónde viene el mensaje",
	"api_int_parent_origin_body": "Tu listener recibe todos los mensajes enviados a la página, incluidos los de otros marcos y extensiones del navegador. Compara event.origin con https://puzzel.org antes de confiar en su contenido.",
	"api_int_parent_same_title": "El mismo payload, el mismo momento",
	"api_int_parent_same_body": "Este es el gemelo del webhook: los mismos campos, enviados en los mismos momentos. Todo lo que dice «Qué contiene un resultado» se aplica también aquí.",
	"api_int_s_completion_title": "Señal de finalización",
	"api_int_s_completion_body": "El canal más pequeño, para cuando el resultado en sí no es asunto tuyo: activa «Enviar una señal de finalización» y tu página recibe un mensaje en el momento en que el jugador termina.",
	"api_int_completion_shape": "Qué llega",
	"api_int_completion_order_title": "El resultado ya está guardado cuando llega",
	"api_int_completion_order_body": "La señal se envía deliberadamente después de que se haya completado el guardado final, así que una página que reaccione leyendo de vuelta el resultado lo encontrará ahí.",
	"api_int_completion_embed_title": "Solo dentro de un iframe",
	"api_int_completion_embed_body": "Ambos canales de mensajes envían a la página que enmarca la actividad. Abierta en su propia pestaña no hay nadie a quien avisar, así que no se envía nada.",
	"api_int_s_payload_title": "Qué contiene un resultado",
	"api_int_s_payload_body": "Una sola forma, sea cual sea el canal que la lleve. Las respuestas del jugador tienen como clave los ids propios de cada elemento de la actividad, así que esas mismas claves aparecen en correctUids.",
	"api_int_col_when": "Cuándo está presente",
	"api_int_always": "siempre",
	"api_int_sometimes": "a veces",
	"api_int_payload_absent_title": "Ausente, no vacío",
	"api_int_payload_absent_body": "Un campo que no aplica se omite del JSON en lugar de enviarse como null o cero. Así se distingue un tipo que no puntúa una partida de una partida que obtuvo cero puntos —así que léelo con un valor por defecto y nunca des por hecho que la clave está presente.",
	"api_int_payload_example": "Un quiz terminado, tal como llega",
	"api_int_f_activity_key": "La actividad a la que pertenece el resultado. La misma clave que ves en la URL propia de la actividad, después de ?p=.",
	"api_int_f_player_uid": "Quién jugó, como id anónimo. Es estable para este jugador en este dispositivo, así que es lo que debes usar como clave de los resultados —no es una dirección de correo ni una cuenta de Puzzel.",
	"api_int_f_player": "Los campos de registro que pide la actividad, tal como los configuraste: nombre, correo, clase, student_id, etc. Está ausente hasta que el jugador se registra, y ausente por completo en una actividad que no pide nada.",
	"api_int_f_progress": "Hasta dónde ha llegado, como porcentaje. 100 significa terminado.",
	"api_int_f_time_passed": "Tiempo en la actividad, en milisegundos.",
	"api_int_f_last_played_at": "Cuándo se guardó este resultado, como marca de tiempo Unix en milisegundos.",
	"api_int_f_created": "Cuándo empezó el intento, como marca de tiempo Unix en milisegundos.",
	"api_int_f_player_input": "Lo que el jugador introdujo realmente, indexado por el id del elemento al que pertenece. La forma interna depende del tipo de actividad —una palabra, una lista de cartas colocadas, una opción elegida.",
	"api_int_f_correct_uids": "Cuáles de esos elementos son correctos, con la misma clave. Está ausente mientras no se haya respondido nada todavía.",
	"api_int_f_score": "Puntos obtenidos, en los tipos que puntúan una partida. Está ausente en el resto de casos —incluida una partida que realmente obtuvo cero puntos, así que comprueba que la clave existe antes de leerla.",
	"api_int_f_performance": "La medida propia de cada tipo de cómo le fue, cuando la tiene —palabras por minuto en práctica de mecanografía, por ejemplo.",
	"api_int_f_attempts": "Qué número de partida es: 1 la primera vez, uno más en cada reinicio. Solo en los tipos que pueden terminar una partida antes de tiempo y cuentan los reintentos.",
	"api_int_f_knocked_out": "La partida terminó con una respuesta incorrecta y acabó sin completarse.",
	"api_int_f_alternate": "La actividad se terminó de una forma que no llega al 100 % —un quiz respondido hasta el final, un campo de solución resuelto. Trátalo como una finalización.",
	"api_int_f_missed_keys": "Caracteres que el jugador seguía fallando, empezando por los más fallados. Solo en práctica de mecanografía.",
	"api_int_f_content_version": "Con qué versión del contenido de la actividad se jugó. Cambia cuando el propietario edita las preguntas, así que un resultado antiguo se puede distinguir de uno actual.",
	"api_int_s_control_title": "Reiniciar la actividad desde tu página",
	"api_int_s_control_body": "Una instrucción viaja en sentido contrario. Con «Aceptar órdenes de la página principal» activado, la página que hace la inserción puede borrar las respuestas del jugador y volver a poner la actividad al principio —para un botón «intentar de nuevo» propio, fuera del marco.",
	"api_int_control_only_title": "Reiniciar es la única orden",
	"api_int_control_only_body": "No existe ningún mensaje para enviar un resultado, abrir el mensaje final o saltar a una pregunta. Un mensaje que pida cualquier cosa que no sea un reinicio se ignora.",
	"api_int_control_guard_title": "Solo se escucha a la página que inserta",
	"api_int_control_guard_body": "La orden solo se acepta desde la página que enmarca la actividad y de ningún otro sitio —ni un marco hermano, ni un script de la página. El ajuste está desactivado por defecto, así que actívalo en las actividades que controles tú.",
	"api_int_s_identity_title": "Aportar tu propia identidad de jugador",
	"api_int_s_identity_body": "Si tu plataforma ya sabe quién está jugando, la actividad no tiene que volver a preguntárselo. Existen dos protocolos de enlace, ambos para una actividad dentro de tu página, y ambos los activamos nosotros en lugar del editor —cambian a quién pertenece un resultado, así que se configuran contigo y no desde una casilla.",
	"api_int_identity_pm_title": "Envíanos el jugador",
	"api_int_identity_pm_body": "La actividad se anuncia con 'app-loaded' y espera. Tu página envía de vuelta los datos del jugador, y el resultado queda archivado a su nombre sin que el jugador escriba nada ni vea una pantalla de registro.",
	"api_int_identity_sso_title": "Envíanos un token",
	"api_int_identity_sso_body": "El mismo protocolo, pero tu página envía el JWT emitido por tu proveedor de identidad en lugar de los campos en sí. Lo verificamos contra los emisores configurados para tu cuenta antes de dejar entrar al jugador, así que la identidad queda demostrada y no solo declarada —este es el que hay que pedir cuando el resultado tiene que ser fiable.",
	"api_int_identity_cta_title": "Pídenos que lo activemos",
	"api_int_identity_cta_body": "Dinos cuál de los dos quieres y dónde se insertarán las actividades, y configuraremos tu cuenta y te acompañaremos en el proceso.",
	"api_int_identity_cta_button": "Escríbenos sobre identidad",
	"api_int_s_create_title": "Crear actividades desde tu sistema",
	"api_int_s_create_body": "Todo lo anterior trata de un resultado que sale. En sentido contrario —crear las actividades a partir de contenido que ya tienes— está la Puzzle API: un POST por tipo de actividad, y recibes de vuelta una clave y una URL para insertar.",
	"api_int_create_link": "Leer la referencia de la API",
	"api_int_s_lms_title": "Cuando un conector ya hecho es la mejor opción",
	"api_int_s_lms_body": "Si la plataforma del otro lado es un LMS de verdad, probablemente no necesites nada de esto. Las calificaciones pueden volver solas a su libro de calificaciones, sin que tengas que alojar nada.",
	"api_int_lms_lti_title": "Moodle, Canvas, Brightspace, Schoology, itslearning",
	"api_int_lms_lti_body": "Se lanza desde dentro del LMS, y la puntuación se escribe de vuelta en su libro de calificaciones.",
	"api_int_lms_gc_title": "Google Classroom",
	"api_int_lms_gc_body": "Publica una actividad como tarea y las calificaciones vuelven automáticamente.",
	"api_int_lms_not_title": "¿No es ninguno de esos?",
	"api_int_lms_not_body": "Las plataformas de cursos, los sitios de membresía, las intranets y cualquier cosa que hayas construido tú mismo son exactamente para lo que sirven los canales de esta página. Una inserción más la señal de finalización cubre la mayoría de los casos.",
	"api_int_s_limits_title": "Lo que no hay",
	"api_int_s_limits_body": "Para que no lo busques donde no está:",
	"api_int_limit_no_read": "No hay ningún endpoint para leer los resultados de vuelta. La API crea actividades; los resultados salen por los canales de esta página, o por las exportaciones de tu panel.",
	"api_int_limit_no_signature": "El webhook no lleva firma. No hay nada contra lo que verificar la solicitud, por eso un resultado no debería ser lo único que respalde algo importante.",
	"api_int_limit_per_activity": "No hay ningún webhook a nivel de cuenta. La URL es un ajuste de cada actividad, así que una actividad que copias lo lleva consigo y una nueva empieza sin él.",
	"api_int_limit_no_multiplayer": "Nada en un juego por equipos o una sala en directo. Tanto los canales de mensajes como el webhook son para juego individual, y los ajustes se desactivan solos cuando el juego por equipos está activado.",
	"api_int_limit_no_retry": "No hay ninguna cola de entrega. Nada se almacena ni se reenvía —el siguiente guardado es el reintento, y la última llamada de la partida es la que cuenta.",
	"api_nav_integrations": "Recuperar los resultados"
}
