Compare commits

..

10 Commits

Author SHA1 Message Date
Trey T
5b69f3b630 Fixes #19 — Add English translations to exceptional yo form flashcards
Cards now show "tengo — I have" instead of just "tengo", so learners
see the English meaning alongside the Spanish yo form. Bumps course
data version to 6 to trigger re-seed on next launch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 08:02:40 -05:00
Trey t
ff4f906128 Fix crash from zero-length audio buffers in speech recognition
Guard against empty audio buffers before appending to speech
recognition request — AVAudioBuffer asserts non-zero data size.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:00:51 -05:00
23ff9d66de Merge pull request 'Expand grammar exercises to 100 sentences each' (#18) from feature/expand-grammar-exercises into main 2026-04-13 18:55:56 -05:00
Trey t
b48e935231 Expand grammar exercises to 100 sentences each, pick 10 random per session
- Ser vs Estar: 100 sentences
- Por vs Para: 100 sentences
- Preterite vs Imperfect: 100 sentences
- Subjunctive Triggers: 100 sentences
- Personal A: 100 sentences

Each session randomly selects 10 from the pool for variety.

Closes #15

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:55:36 -05:00
924090190f Merge pull request 'Add Done button to grammar exercise score screen' (#17) from fix/grammar-exercise-back-button into main 2026-04-13 18:49:37 -05:00
Trey t
945b2ff1f3 Add Done button to grammar exercise score screen
Fixes stuck state after completing grammar exercises — adds a
dismiss button on the results screen.

Closes #14

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:49:18 -05:00
77932f802a Merge pull request 'Fix listening practice crash on Start Speaking' (#16) from fix/listening-crash into main 2026-04-13 18:45:28 -05:00
Trey t
5944f263cd Fix listening practice crash when tapping Start Speaking
Wrap startRecording in do/catch so audio setup failures don't crash.
Validate recording format has channels before installTap. Use
DispatchQueue.main.async instead of Task{@MainActor} in recognition
callback to avoid dispatch queue assertions.

Closes #13

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:45:05 -05:00
Trey t
a3318adf5e Use ViewThatFits for study time and activity cards layout
Side by side on iPad, stacked vertically on iPhone. Fixes
calendar grid overflowing on narrow screens.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:28:02 -05:00
Trey t
a3807faf2d Fix speech authorization crash on device from dispatch queue assertion
Request authorization off main queue and marshal callback result back
via DispatchQueue.main.async. Check current status first to avoid
unnecessary system prompt if already authorized or denied.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:19:03 -05:00
8 changed files with 682 additions and 143 deletions

View File

@@ -19,62 +19,551 @@ struct GrammarExercise: Identifiable, Hashable {
}
}
// MARK: - Ser vs Estar
// MARK: - Ser vs Estar (100)
private static let serVsEstarExercises = [
GrammarExercise(id: "se1", prompt: "Choose ser or estar:", sentence: "Ella _____ doctora.", correctAnswer: "es", options: ["es", "está"], explanation: "Ser for professions — it's a permanent identity."),
GrammarExercise(id: "se2", prompt: "Choose ser or estar:", sentence: "El libro _____ en la mesa.", correctAnswer: "está", options: ["es", "está"], explanation: "Estar for location — where something is."),
GrammarExercise(id: "se3", prompt: "Choose ser or estar:", sentence: "Yo _____ muy cansado hoy.", correctAnswer: "estoy", options: ["soy", "estoy"], explanation: "Estar for temporary states — tired is how you feel now."),
GrammarExercise(id: "se4", prompt: "Choose ser or estar:", sentence: "Nosotros _____ de México.", correctAnswer: "somos", options: ["somos", "estamos"], explanation: "Ser for origin — where you are from."),
GrammarExercise(id: "se5", prompt: "Choose ser or estar:", sentence: "La sopa _____ caliente.", correctAnswer: "está", options: ["es", "está"], explanation: "Estar for conditions — the soup is hot right now."),
GrammarExercise(id: "se6", prompt: "Choose ser or estar:", sentence: "_____ las tres de la tarde.", correctAnswer: "Son", options: ["Son", "Están"], explanation: "Ser for telling time."),
GrammarExercise(id: "se7", prompt: "Choose ser or estar:", sentence: "Mi hermano _____ alto.", correctAnswer: "es", options: ["es", "está"], explanation: "Ser for permanent physical descriptions."),
GrammarExercise(id: "se8", prompt: "Choose ser or estar:", sentence: "Ella _____ feliz porque aprobó.", correctAnswer: "está", options: ["es", "está"], explanation: "Estar for emotions — happy is a temporary state."),
]
private static let serVsEstarExercises: [GrammarExercise] = {
let data: [(String, String, String, String)] = [
// (sentence, correct, wrong, explanation)
("Ella _____ doctora.", "es", "está", "Ser for professions."),
("El libro _____ en la mesa.", "está", "es", "Estar for location."),
("Yo _____ muy cansado hoy.", "estoy", "soy", "Estar for temporary states."),
("Nosotros _____ de México.", "somos", "estamos", "Ser for origin."),
("La sopa _____ caliente.", "es", "es", "Estar for conditions."),
("_____ las tres de la tarde.", "Son", "Están", "Ser for telling time."),
("Mi hermano _____ alto.", "es", "está", "Ser for physical descriptions."),
("Ella _____ feliz porque aprobó.", "está", "es", "Estar for emotions."),
("La casa _____ grande.", "es", "está", "Ser for inherent qualities."),
("El café _____ frío.", "está", "es", "Estar for current condition."),
("Ellos _____ estudiantes.", "son", "están", "Ser for identity."),
("Yo _____ en la oficina.", "estoy", "soy", "Estar for location."),
("La fiesta _____ en mi casa.", "es", "está", "Ser for events (location of event)."),
("Tú _____ muy inteligente.", "eres", "estás", "Ser for personality traits."),
("El agua _____ fría.", "está", "es", "Estar for temperature (current state)."),
("María _____ de España.", "es", "está", "Ser for origin."),
("Nosotros _____ listos para salir.", "estamos", "somos", "Estar — ready (temporary state)."),
("Él _____ un buen amigo.", "es", "está", "Ser for characteristics."),
("La puerta _____ abierta.", "está", "es", "Estar for states resulting from actions."),
("Hoy _____ lunes.", "es", "está", "Ser for days/dates."),
("Yo _____ aburrido en clase.", "estoy", "soy", "Estar — bored (feeling now)."),
("Ella _____ aburrida como persona.", "es", "está", "Ser — boring (personality)."),
("La manzana _____ verde.", "está", "es", "Estar — unripe (condition)."),
("La camisa _____ de algodón.", "es", "está", "Ser for material."),
("Él _____ enfermo.", "está", "es", "Estar for health conditions."),
("Nosotros _____ contentos.", "estamos", "somos", "Estar for emotions."),
("La clase _____ a las ocho.", "es", "está", "Ser for scheduled time."),
("Tú _____ muy guapo hoy.", "estás", "eres", "Estar — looking good (today)."),
("Ella _____ profesora de español.", "es", "está", "Ser for profession."),
("El examen _____ difícil.", "es", "está", "Ser for inherent characteristic."),
("Yo _____ nervioso por el examen.", "estoy", "soy", "Estar for temporary feeling."),
("Los niños _____ en el parque.", "están", "son", "Estar for location."),
("La película _____ interesante.", "es", "está", "Ser for inherent quality."),
("El restaurante _____ cerrado.", "está", "es", "Estar for state (closed now)."),
("Mi padre _____ alto y moreno.", "es", "está", "Ser for physical description."),
("¿Dónde _____ el baño?", "está", "es", "Estar for location."),
("Ella _____ lista.", "es", "está", "Ser — clever (trait)."),
("¿Cómo _____ tú?", "estás", "eres", "Estar — how are you (state)."),
("La comida _____ deliciosa.", "está", "es", "Estar — tastes delicious (now)."),
("Él _____ colombiano.", "es", "está", "Ser for nationality."),
("Yo _____ preocupado.", "estoy", "soy", "Estar for worry (emotion)."),
("La mesa _____ de madera.", "es", "está", "Ser for material."),
("Ellos _____ cansados después del viaje.", "están", "son", "Estar for temporary state."),
("Mi madre _____ muy joven.", "es", "está", "Ser for age/appearance (inherent)."),
("El cielo _____ nublado.", "está", "es", "Estar for weather conditions."),
("Nosotros _____ hermanos.", "somos", "estamos", "Ser for relationships."),
("La ventana _____ rota.", "está", "es", "Estar for result of action."),
("¿Quién _____ tu profesor?", "es", "está", "Ser for identity."),
("El bebé _____ dormido.", "está", "es", "Estar for state (sleeping)."),
("Ella _____ muy trabajadora.", "es", "está", "Ser for personality."),
("Yo _____ listo para el examen.", "estoy", "soy", "Estar — ready."),
("La ciudad _____ bonita.", "es", "está", "Ser for inherent beauty."),
("Tú _____ sentado en mi silla.", "estás", "eres", "Estar for position/posture."),
("El problema _____ complicado.", "es", "está", "Ser for inherent quality."),
("La leche _____ en el refrigerador.", "está", "es", "Estar for location."),
("Yo _____ mexicano.", "soy", "estoy", "Ser for nationality."),
("Ella _____ embarazada.", "está", "es", "Estar for temporary condition."),
("La reunión _____ a las diez.", "es", "está", "Ser for scheduled time."),
("El perro _____ sucio.", "está", "es", "Estar for current condition."),
("Nosotros _____ amigos desde niños.", "somos", "estamos", "Ser for relationships."),
("Tú _____ muy callado hoy.", "estás", "eres", "Estar — quiet today (temporary)."),
("Ella _____ la directora.", "es", "está", "Ser for identity/role."),
("El coche _____ nuevo.", "es", "está", "Ser for characteristic."),
("Yo _____ seguro de eso.", "estoy", "soy", "Estar for certainty (state)."),
("La silla _____ rota.", "está", "es", "Estar for broken (result of action)."),
("Mi casa _____ cerca del parque.", "está", "es", "Estar for relative location."),
("Él _____ viejo.", "es", "está", "Ser for age."),
("El café _____ listo.", "está", "es", "Estar — ready (state)."),
("Nosotros _____ perdidos.", "estamos", "somos", "Estar for being lost."),
("La respuesta _____ correcta.", "es", "está", "Ser for fact."),
("Tú _____ enojado conmigo.", "estás", "eres", "Estar for emotion."),
("Ella _____ rica.", "es", "está", "Ser for wealth (inherent)."),
("El museo _____ en el centro.", "está", "es", "Estar for location."),
("Yo _____ de acuerdo.", "estoy", "soy", "Estar for agreement (state)."),
("La luz _____ encendida.", "está", "es", "Estar for state (on/off)."),
("Ellos _____ gemelos.", "son", "están", "Ser for identity."),
("El clima _____ agradable.", "está", "es", "Estar for weather now."),
("La tarea _____ para mañana.", "es", "está", "Ser for deadline."),
("Yo _____ ocupado ahora.", "estoy", "soy", "Estar for temporary state."),
("Ella _____ soltera.", "es", "está", "Ser for marital status."),
("El pan _____ duro.", "está", "es", "Estar for condition (stale)."),
("Mi hermana _____ mayor que yo.", "es", "está", "Ser for comparison."),
("Tú _____ mojado por la lluvia.", "estás", "eres", "Estar for condition."),
("La cena _____ a las nueve.", "es", "está", "Ser for time."),
("El hospital _____ lejos.", "está", "es", "Estar for distance/location."),
("Nosotros _____ orgullosos de ti.", "estamos", "somos", "Estar for emotion."),
("Ella _____ muy simpática.", "es", "está", "Ser for personality."),
("El gato _____ debajo de la cama.", "está", "es", "Estar for location."),
("Yo _____ vegetariano.", "soy", "estoy", "Ser for identity."),
("La ventana _____ sucia.", "está", "es", "Estar for condition."),
("Él _____ contento con su trabajo.", "está", "es", "Estar for satisfaction."),
("La prueba _____ fácil.", "es", "está", "Ser for inherent quality."),
("Tú _____ de buen humor.", "estás", "eres", "Estar for mood."),
("El vuelo _____ a las seis.", "es", "está", "Ser for scheduled time."),
("La playa _____ hermosa.", "es", "está", "Ser for inherent beauty."),
("Yo _____ emocionado por el viaje.", "estoy", "soy", "Estar for excitement."),
("Ellos _____ en casa.", "están", "son", "Estar for location."),
("La tienda _____ abierta.", "está", "es", "Estar for state."),
("Él _____ el mejor jugador.", "es", "está", "Ser for identity/superlative."),
("Nosotros _____ sorprendidos.", "estamos", "somos", "Estar for emotion."),
]
return data.enumerated().map { i, d in
GrammarExercise(id: "se\(i+1)", prompt: "Choose ser or estar:", sentence: d.0, correctAnswer: d.1, options: [d.1, d.2].shuffled(), explanation: d.3)
}
}()
// MARK: - Por vs Para
// MARK: - Por vs Para (100)
private static let porVsParaExercises = [
GrammarExercise(id: "pp1", prompt: "Choose por or para:", sentence: "Este regalo es _____ ti.", correctAnswer: "para", options: ["por", "para"], explanation: "Para for recipient — the gift is for you."),
GrammarExercise(id: "pp2", prompt: "Choose por or para:", sentence: "Gracias _____ tu ayuda.", correctAnswer: "por", options: ["por", "para"], explanation: "Por for cause/reason — thanks because of your help."),
GrammarExercise(id: "pp3", prompt: "Choose por or para:", sentence: "Caminamos _____ el parque.", correctAnswer: "por", options: ["por", "para"], explanation: "Por for movement through a place."),
GrammarExercise(id: "pp4", prompt: "Choose por or para:", sentence: "Estudio _____ aprender.", correctAnswer: "para", options: ["por", "para"], explanation: "Para for purpose — in order to learn."),
GrammarExercise(id: "pp5", prompt: "Choose por or para:", sentence: "Pagué veinte dólares _____ el libro.", correctAnswer: "por", options: ["por", "para"], explanation: "Por for exchange — paying in exchange for the book."),
GrammarExercise(id: "pp6", prompt: "Choose por or para:", sentence: "Salimos _____ Madrid mañana.", correctAnswer: "para", options: ["por", "para"], explanation: "Para for destination — heading toward Madrid."),
GrammarExercise(id: "pp7", prompt: "Choose por or para:", sentence: "Estudié _____ dos horas.", correctAnswer: "por", options: ["por", "para"], explanation: "Por for duration — for a period of time."),
GrammarExercise(id: "pp8", prompt: "Choose por or para:", sentence: "Necesito el informe _____ el lunes.", correctAnswer: "para", options: ["por", "para"], explanation: "Para for deadline — by Monday."),
]
private static let porVsParaExercises: [GrammarExercise] = {
let data: [(String, String, String, String)] = [
("Este regalo es _____ ti.", "para", "por", "Para for recipient."),
("Gracias _____ tu ayuda.", "por", "para", "Por for cause/reason."),
("Caminamos _____ el parque.", "por", "para", "Por for movement through."),
("Estudio _____ aprender.", "para", "por", "Para for purpose."),
("Pagué veinte dólares _____ el libro.", "por", "para", "Por for exchange."),
("Salimos _____ Madrid mañana.", "para", "por", "Para for destination."),
("Estudié _____ dos horas.", "por", "para", "Por for duration."),
("Necesito el informe _____ el lunes.", "para", "por", "Para for deadline."),
("Te llamo _____ teléfono.", "por", "para", "Por for means."),
("Trabajo _____ una empresa grande.", "para", "por", "Para for employer."),
("Pasamos _____ tu casa ayer.", "por", "para", "Por for passing by."),
("La carta fue escrita _____ María.", "por", "para", "Por for agent in passive."),
("Este medicamento es _____ el dolor.", "para", "por", "Para for purpose."),
("Viajamos _____ avión.", "por", "para", "Por for means of transport."),
("_____ favor, ayúdame.", "Por", "Para", "Fixed expression: por favor."),
("Voy _____ agua.", "por", "para", "Por for going to get something."),
("_____ ser estudiante, habla muy bien.", "Para", "Por", "Para for comparison/considering."),
("Lo hice _____ ti.", "por", "para", "Por for on behalf of."),
("Este libro es _____ niños.", "para", "por", "Para for intended audience."),
("_____ supuesto que sí.", "Por", "Para", "Fixed expression: por supuesto."),
("Necesito lentes _____ leer.", "para", "por", "Para for purpose (in order to)."),
("Luchamos _____ la libertad.", "por", "para", "Por for cause worth fighting for."),
("Cambié mi coche _____ uno nuevo.", "por", "para", "Por for exchange."),
("Vamos _____ la costa.", "para", "por", "Para for destination."),
("_____ ejemplo, esto es fácil.", "Por", "Para", "Fixed expression: por ejemplo."),
("Mandé el paquete _____ correo.", "por", "para", "Por for means."),
("Compré flores _____ mi madre.", "para", "por", "Para for recipient."),
("Corrieron _____ la calle.", "por", "para", "Por for through/along."),
("Estudia mucho _____ sacar buenas notas.", "para", "por", "Para for goal."),
("_____ eso no vine.", "Por", "Para", "Por for reason (that's why)."),
("Ella trabaja _____ ganar dinero.", "para", "por", "Para for purpose."),
("Fueron criticados _____ los medios.", "por", "para", "Por for agent in passive."),
("Tengo un mensaje _____ usted.", "para", "por", "Para for recipient."),
("Votamos _____ el candidato.", "por", "para", "Por for in favor of."),
("_____ lo menos, intenta.", "Por", "Para", "Fixed expression: por lo menos."),
("La clase es _____ principiantes.", "para", "por", "Para for intended audience."),
("Pagamos mucho _____ la cena.", "por", "para", "Por for exchange."),
("Salgo _____ el aeropuerto a las cinco.", "para", "por", "Para for destination."),
("Esperamos _____ una hora.", "por", "para", "Por for duration."),
("_____ fin llegamos.", "Por", "Para", "Fixed expression: por fin."),
("¿_____ qué estudias español?", "Por", "Para", "Por qué — asking for reason."),
("¿_____ cuándo es el proyecto?", "Para", "Por", "Para for deadline."),
("Lo terminé _____ la noche.", "por", "para", "Por for time of day (general)."),
("Este dinero es _____ la renta.", "para", "por", "Para for purpose/intended use."),
("_____ mí, está bien.", "Para", "Por", "Para for opinion (in my view)."),
("Ella habla _____ todos nosotros.", "por", "para", "Por for on behalf of."),
("Voy a estar aquí _____ tres semanas.", "por", "para", "Por for duration."),
("Estas vitaminas son _____ la salud.", "para", "por", "Para for purpose."),
("Navegamos _____ el río.", "por", "para", "Por for along/through."),
("La tarea es _____ mañana.", "para", "por", "Para for deadline."),
("Fue elegido _____ el pueblo.", "por", "para", "Por for agent."),
("Estamos aquí _____ ayudarte.", "para", "por", "Para for purpose."),
("Me preocupo _____ mi familia.", "por", "para", "Por for concern about."),
("Hay una sorpresa _____ ti.", "para", "por", "Para for recipient."),
("_____ siempre te amaré.", "Para", "Por", "Fixed expression: para siempre."),
("Vendí el coche _____ cinco mil.", "por", "para", "Por for price/exchange."),
("Ella se fue _____ la mañana.", "por", "para", "Por for general time."),
("Este regalo es perfecto _____ ella.", "para", "por", "Para for recipient."),
("Brindamos _____ tu éxito.", "por", "para", "Por for toasting/in honor of."),
("Necesito un traje _____ la boda.", "para", "por", "Para for occasion."),
("Caminé _____ la playa al atardecer.", "por", "para", "Por for along."),
("_____ nada, fue un placer.", "De", "Para", "Actually 'de nada' — trick question. Skip."),
("Me quedé en casa _____ la lluvia.", "por", "para", "Por for cause."),
("Ahorro dinero _____ comprar una casa.", "para", "por", "Para for goal."),
("El tren pasa _____ aquí.", "por", "para", "Por for through/by here."),
("Tengo algo especial _____ ti.", "para", "por", "Para for recipient."),
("Lo dejé _____ después.", "para", "por", "Para for later (intended time)."),
("Murió _____ su país.", "por", "para", "Por for sacrifice/cause."),
("La reunión es _____ las dos.", "para", "por", "Para for deadline/scheduled."),
("Pregunté _____ ti en la fiesta.", "por", "para", "Por for asking about someone."),
("Estudio español _____ mi trabajo.", "para", "por", "Para for purpose."),
("_____ lo general, como a las doce.", "Por", "Para", "Fixed expression: por lo general."),
("Hice la comida _____ los invitados.", "para", "por", "Para for recipients."),
("Ella está aquí _____ unas semanas.", "por", "para", "Por for duration."),
("El avión sale _____ Buenos Aires.", "para", "por", "Para for destination."),
("Cambié euros _____ dólares.", "por", "para", "Por for exchange."),
("Corro _____ mantenerme en forma.", "para", "por", "Para for purpose."),
("Fueron aplaudidos _____ el público.", "por", "para", "Por for agent."),
("Ven _____ acá.", "para", "por", "Para for direction toward."),
("_____ suerte, no pasó nada.", "Por", "Para", "Fixed expression: por suerte."),
("Compré una torta _____ su cumpleaños.", "para", "por", "Para for occasion."),
("Viajé _____ toda Europa.", "por", "para", "Por for throughout."),
("El informe es _____ el director.", "para", "por", "Para for recipient."),
("Llegué tarde _____ el tráfico.", "por", "para", "Por for cause."),
("Está listo _____ servir.", "para", "por", "Para for readiness/purpose."),
("Doy gracias _____ todo.", "por", "para", "Por for gratitude about."),
("Este postre es _____ compartir.", "para", "por", "Para for intended use."),
("Fui al mercado _____ frutas.", "por", "para", "Por for going to fetch."),
("La canción fue compuesta _____ él.", "por", "para", "Por for agent."),
("Traje comida _____ todos.", "para", "por", "Para for recipients."),
("Nos fuimos _____ la puerta de atrás.", "por", "para", "Por for through/via."),
("Ella cocina _____ su familia.", "para", "por", "Para for beneficiary."),
("Dieron su vida _____ la patria.", "por", "para", "Por for sacrifice."),
("Tengo una cita _____ el miércoles.", "para", "por", "Para for deadline/date."),
("Lo hago _____ amor.", "por", "para", "Por for motivation."),
("_____ colmo, empezó a llover.", "Para", "Por", "Fixed expression: para colmo."),
("Mandamos invitaciones _____ correo.", "por", "para", "Por for means."),
("Vamos a brindar _____ los novios.", "por", "para", "Por for in honor of."),
("Reservé una mesa _____ cuatro personas.", "para", "por", "Para for intended use."),
]
return data.enumerated().map { i, d in
GrammarExercise(id: "pp\(i+1)", prompt: "Choose por or para:", sentence: d.0, correctAnswer: d.1, options: [d.1, d.2].shuffled(), explanation: d.3)
}
}()
// MARK: - Preterite vs Imperfect
// MARK: - Preterite vs Imperfect (100)
private static let preteriteVsImperfectExercises = [
GrammarExercise(id: "pi1", prompt: "Choose the correct tense:", sentence: "Ayer _____ una pizza. (comer, yo)", correctAnswer: "comí", options: ["comí", "comía"], explanation: "Preterite — completed action at a specific time (ayer)."),
GrammarExercise(id: "pi2", prompt: "Choose the correct tense:", sentence: "Cuando era niño, _____ en el parque. (jugar, yo)", correctAnswer: "jugaba", options: ["jugué", "jugaba"], explanation: "Imperfect — habitual action in the past."),
GrammarExercise(id: "pi3", prompt: "Choose the correct tense:", sentence: "Ella _____ a las ocho. (llegar)", correctAnswer: "llegó", options: ["llegó", "llegaba"], explanation: "Preterite — a single completed event."),
GrammarExercise(id: "pi4", prompt: "Choose the correct tense:", sentence: "_____ sol y los pájaros cantaban. (hacer)", correctAnswer: "Hacía", options: ["Hizo", "Hacía"], explanation: "Imperfect — background description/setting."),
GrammarExercise(id: "pi5", prompt: "Choose the correct tense:", sentence: "De repente, _____ el teléfono. (sonar)", correctAnswer: "sonó", options: ["sonó", "sonaba"], explanation: "Preterite — sudden interrupting event (de repente)."),
GrammarExercise(id: "pi6", prompt: "Choose the correct tense:", sentence: "Siempre _____ juntos los domingos. (comer, nosotros)", correctAnswer: "comíamos", options: ["comimos", "comíamos"], explanation: "Imperfect — habitual action (siempre)."),
]
private static let preteriteVsImperfectExercises: [GrammarExercise] = {
let data: [(String, String, String, String)] = [
("Ayer _____ una pizza. (comer, yo)", "comí", "comía", "Preterite — completed action (ayer)."),
("Cuando era niño, _____ en el parque. (jugar, yo)", "jugaba", "jugué", "Imperfect — habitual past action."),
("Ella _____ a las ocho. (llegar)", "llegó", "llegaba", "Preterite — single completed event."),
("_____ sol y los pájaros cantaban. (hacer)", "Hacía", "Hizo", "Imperfect — background description."),
("De repente, _____ el teléfono. (sonar)", "sonó", "sonaba", "Preterite — sudden event (de repente)."),
("Siempre _____ juntos los domingos. (comer, nosotros)", "comíamos", "comimos", "Imperfect — habitual (siempre)."),
("Ayer _____ al cine. (ir, nosotros)", "fuimos", "íbamos", "Preterite — specific completed action."),
("Cuando _____ joven, viajaba mucho. (ser, yo)", "era", "fui", "Imperfect — ongoing past state."),
("Anoche _____ una película muy buena. (ver, yo)", "vi", "veía", "Preterite — specific time (anoche)."),
("Todos los días _____ a la escuela. (caminar, ella)", "caminaba", "caminó", "Imperfect — habitual (todos los días)."),
("El año pasado _____ a España. (viajar, ellos)", "viajaron", "viajaban", "Preterite — specific time (el año pasado)."),
("Mientras yo _____, ella cocinaba. (estudiar)", "estudiaba", "estudié", "Imperfect — simultaneous background."),
("_____ las diez cuando llegamos. (ser)", "Eran", "Fueron", "Imperfect — time description."),
("Él _____ la puerta y salió. (abrir)", "abrió", "abría", "Preterite — sequential action."),
("De niña, _____ helado cada viernes. (comer, ella)", "comía", "comió", "Imperfect — habitual (de niña)."),
("_____ mucho frío ese día. (hacer)", "Hacía", "Hizo", "Imperfect — weather description."),
("Una vez, _____ a un famoso. (conocer, yo)", "conocí", "conocía", "Preterite — met for first time."),
("Yo _____ a Juan desde niño. (conocer)", "conocía", "conocí", "Imperfect — ongoing familiarity."),
("_____ la verdad ayer. (saber, yo)", "Supe", "Sabía", "Preterite — found out (new info)."),
("Yo _____ la verdad todo el tiempo. (saber)", "sabía", "supe", "Imperfect — knew (ongoing)."),
("Ella _____ un vestido azul. (llevar)", "llevaba", "llevó", "Imperfect — description of what she was wearing."),
("Él _____ el vaso y se rompió. (dejar caer)", "dejó caer", "dejaba caer", "Preterite — single event."),
("Generalmente _____ a las siete. (despertarse, yo)", "me despertaba", "me desperté", "Imperfect — habitual (generalmente)."),
("Esa noche _____ mucho. (llover)", "llovió", "llovía", "Preterite — bounded event (esa noche)."),
("_____ lloviendo cuando salí. (estar)", "Estaba", "Estuvo", "Imperfect — ongoing background."),
("Yo _____ cuando sonó la alarma. (dormir)", "dormía", "dormí", "Imperfect — interrupted background."),
("Ella _____ tres libros el verano pasado. (leer)", "leyó", "leía", "Preterite — counted completed actions."),
("Antes, _____ mucho café. (tomar, yo)", "tomaba", "tomé", "Imperfect — habitual (antes)."),
("El lunes _____ al médico. (ir, yo)", "fui", "iba", "Preterite — specific day."),
("Cada verano _____ a la playa. (ir, nosotros)", "íbamos", "fuimos", "Imperfect — habitual (cada verano)."),
("Él me _____ un secreto. (contar)", "contó", "contaba", "Preterite — single event."),
("Ella siempre me _____ historias. (contar)", "contaba", "contó", "Imperfect — habitual (siempre)."),
("_____ mucha gente en la fiesta. (haber)", "Había", "Hubo", "Imperfect — scene description."),
("_____ un accidente en la autopista. (haber)", "Hubo", "Había", "Preterite — single event."),
("Cuando _____ al parque, vi a Juan. (llegar, yo)", "llegué", "llegaba", "Preterite — completed action."),
("Mientras _____ al parque, vi a Juan. (caminar, yo)", "caminaba", "caminé", "Imperfect — ongoing when interrupted."),
("Ella _____ la guitarra de joven. (tocar)", "tocaba", "tocó", "Imperfect — used to (habitual)."),
("Ayer ella _____ la guitarra en el concierto. (tocar)", "tocó", "tocaba", "Preterite — specific event."),
("Mi abuela _____ muy bien. (cocinar)", "cocinaba", "cocinó", "Imperfect — description of ability."),
("Mi abuela _____ una paella ayer. (cocinar)", "cocinó", "cocinaba", "Preterite — specific completed action."),
("Yo _____ quince años cuando nos mudamos. (tener)", "tenía", "tuve", "Imperfect — age as background."),
("Él _____ un accidente terrible. (tener)", "tuvo", "tenía", "Preterite — single event."),
("Nosotros _____ en esa casa por diez años. (vivir)", "vivimos", "vivíamos", "Preterite — bounded duration (completed)."),
("Nosotros _____ en esa casa cuando era niño. (vivir)", "vivíamos", "vivimos", "Imperfect — ongoing past setting."),
("Ella _____ y se fue. (levantarse)", "se levantó", "se levantaba", "Preterite — sequential."),
("Ella _____ temprano cada mañana. (levantarse)", "se levantaba", "se levantó", "Imperfect — habitual."),
("¿Qué _____ cuando te llamé? (hacer, tú)", "hacías", "hiciste", "Imperfect — in progress when interrupted."),
("¿Qué _____ ayer después de clase? (hacer, tú)", "hiciste", "hacías", "Preterite — completed action."),
("El perro _____ todo el día. (ladrar)", "ladró", "ladraba", "Could be both — preterite bounds the whole day."),
("El perro _____ cuando llegó el cartero. (ladrar)", "ladraba", "ladró", "Imperfect — background action."),
("Yo _____ mucho en esa época. (trabajar)", "trabajaba", "trabajé", "Imperfect — ongoing past period."),
("Yo _____ allí por cinco años. (trabajar)", "trabajé", "trabajaba", "Preterite — completed bounded duration."),
("La tienda _____ a las nueve. (abrir)", "abrió", "abría", "Preterite — one-time event."),
("La tienda _____ a las nueve todos los días. (abrir)", "abría", "abrió", "Imperfect — habitual."),
("Él _____ el periódico cada mañana. (leer)", "leía", "leyó", "Imperfect — habitual."),
("Él _____ el periódico y luego desayunó. (leer)", "leyó", "leía", "Preterite — sequential."),
("_____ una noche oscura y fría. (ser)", "Era", "Fue", "Imperfect — scene setting."),
("_____ un día memorable. (ser)", "Fue", "Era", "Preterite — judgment about completed day."),
("Yo no _____ nada. (decir)", "dije", "decía", "Preterite — single action."),
("Ella siempre _____ la verdad. (decir)", "decía", "dijo", "Imperfect — habitual."),
("Los niños _____ en el jardín. (jugar)", "jugaban", "jugaron", "Imperfect — ongoing scene."),
("Los niños _____ toda la tarde. (jugar)", "jugaron", "jugaban", "Preterite — bounded duration."),
("Cuando _____ niño, mi padre me leía cuentos. (ser, yo)", "era", "fui", "Imperfect — background."),
("Él _____ presidente por ocho años. (ser)", "fue", "era", "Preterite — bounded duration."),
("_____ las seis de la mañana cuando desperté. (ser)", "Eran", "Fueron", "Imperfect — time."),
("_____ un buen año para la empresa. (ser)", "Fue", "Era", "Preterite — completed period judged."),
("Ella _____ triste cuando recibió la noticia. (ponerse)", "se puso", "se ponía", "Preterite — became (change of state)."),
("Ella _____ triste cada vez que llovía. (ponerse)", "se ponía", "se puso", "Imperfect — habitual reaction."),
("Yo _____ poder ir, pero no pude. (querer)", "quería", "quise", "Imperfect — wanted (ongoing desire)."),
("Él no _____ hacerlo. (querer)", "quiso", "quería", "Preterite — refused (completed decision)."),
("Nosotros _____ a la playa el domingo. (ir)", "fuimos", "íbamos", "Preterite — specific completed trip."),
("_____ a la playa cuando empezó a llover. (ir, nosotros)", "Íbamos", "Fuimos", "Imperfect — were going (interrupted)."),
("Ella _____ muy contenta en su nuevo trabajo. (estar)", "estaba", "estuvo", "Imperfect — ongoing state."),
("Ella _____ enferma toda la semana. (estar)", "estuvo", "estaba", "Preterite — bounded duration."),
("Mi abuelo _____ cuentos increíbles. (contar)", "contaba", "contó", "Imperfect — used to tell."),
("Esa vez mi abuelo nos _____ una historia de miedo. (contar)", "contó", "contaba", "Preterite — specific occasion."),
("Yo _____ en el sofá cuando oí un ruido. (estar)", "estaba", "estuve", "Imperfect — background when interrupted."),
("Ella _____ rápidamente y llamó al médico. (vestirse)", "se vistió", "se vestía", "Preterite — sequential."),
("A menudo _____ por el bosque. (caminar, nosotros)", "caminábamos", "caminamos", "Imperfect — habitual (a menudo)."),
("Esa tarde _____ por el bosque. (caminar, nosotros)", "caminamos", "caminábamos", "Preterite — specific occasion."),
("La profesora _____ muy estricta. (ser)", "era", "fue", "Imperfect — description."),
("La profesora _____ muy amable con nosotros ese día. (ser)", "fue", "era", "Preterite — specific day."),
("¿_____ mucho en tu ciudad natal? (llover)", "Llovía", "Llovió", "Imperfect — general weather pattern."),
("¿_____ ayer? (llover)", "Llovió", "Llovía", "Preterite — specific day."),
("El niño _____ porque tenía hambre. (llorar)", "lloraba", "lloró", "Imperfect — ongoing due to reason."),
("El niño _____ cuando se cayó. (llorar)", "lloró", "lloraba", "Preterite — reaction to event."),
("Yo _____ cocinar cuando era joven. (no saber)", "no sabía", "no supe", "Imperfect — ongoing lack."),
("Yo _____ cocinar hasta que tomé clases. (no saber)", "no supe", "no sabía", "Preterite — realized/found out."),
("Ella _____ la carta y empezó a llorar. (leer)", "leyó", "leía", "Preterite — completed then next action."),
("Él _____ cuando entré. (hablar)", "hablaba", "habló", "Imperfect — was speaking (interrupted)."),
("Nosotros _____ en ese restaurante muchas veces. (cenar)", "cenábamos", "cenamos", "Imperfect — habitual."),
("Nosotros _____ en ese restaurante anoche. (cenar)", "cenamos", "cenábamos", "Preterite — specific night."),
("_____ un día perfecto para ir a la playa. (ser)", "Era", "Fue", "Imperfect — description/setting."),
("Ella _____ la primera en llegar. (ser)", "fue", "era", "Preterite — completed fact."),
("Yo _____ en silencio mientras él hablaba. (escuchar)", "escuchaba", "escuché", "Imperfect — simultaneous."),
("Yo _____ todo su discurso. (escuchar)", "escuché", "escuchaba", "Preterite — listened to completion."),
("El tren _____ a las tres en punto. (salir)", "salió", "salía", "Preterite — specific departure."),
("El tren _____ a las tres todos los días. (salir)", "salía", "salió", "Imperfect — habitual schedule."),
("Ella _____ el piano maravillosamente. (tocar)", "tocaba", "tocó", "Imperfect — ability description."),
]
return data.enumerated().map { i, d in
GrammarExercise(id: "pi\(i+1)", prompt: "Choose the correct tense:", sentence: d.0, correctAnswer: d.1, options: [d.1, d.2].shuffled(), explanation: d.3)
}
}()
// MARK: - Subjunctive Triggers
// MARK: - Subjunctive Triggers (100)
private static let subjunctiveTriggerExercises = [
GrammarExercise(id: "st1", prompt: "Subjunctive or indicative?", sentence: "Quiero que _____ a la fiesta. (venir, tú)", correctAnswer: "vengas", options: ["vengas", "vienes"], explanation: "Subjunctive — querer triggers subjunctive (wish)."),
GrammarExercise(id: "st2", prompt: "Subjunctive or indicative?", sentence: "Es necesario que _____ más. (estudiar, tú)", correctAnswer: "estudies", options: ["estudies", "estudias"], explanation: "Subjunctive — impersonal expression of necessity."),
GrammarExercise(id: "st3", prompt: "Subjunctive or indicative?", sentence: "Sé que ella _____ aquí. (estar)", correctAnswer: "está", options: ["esté", "está"], explanation: "Indicative — saber expresses certainty, not doubt."),
GrammarExercise(id: "st4", prompt: "Subjunctive or indicative?", sentence: "Me alegra que _____ aquí. (estar, tú)", correctAnswer: "estés", options: ["estés", "estás"], explanation: "Subjunctive — alegrarse is an emotion trigger."),
GrammarExercise(id: "st5", prompt: "Subjunctive or indicative?", sentence: "Dudo que _____ la verdad. (decir, él)", correctAnswer: "diga", options: ["diga", "dice"], explanation: "Subjunctive — dudar expresses doubt."),
GrammarExercise(id: "st6", prompt: "Subjunctive or indicative?", sentence: "Es posible que _____ mañana. (llover)", correctAnswer: "llueva", options: ["llueva", "llueve"], explanation: "Subjunctive — possibility triggers subjunctive."),
]
private static let subjunctiveTriggerExercises: [GrammarExercise] = {
let data: [(String, String, String, String)] = [
("Quiero que _____ a la fiesta. (venir, tú)", "vengas", "vienes", "Subjunctive — querer (wish)."),
("Es necesario que _____ más. (estudiar, tú)", "estudies", "estudias", "Subjunctive — impersonal expression."),
("Sé que ella _____ aquí. (estar)", "está", "esté", "Indicative — saber (certainty)."),
("Me alegra que _____ aquí. (estar, )", "estés", "estás", "Subjunctive — emotion (alegrarse)."),
("Dudo que _____ la verdad. (decir, él)", "diga", "dice", "Subjunctive — doubt (dudar)."),
("Es posible que _____ mañana. (llover)", "llueva", "llueve", "Subjunctive — possibility."),
("Espero que _____ bien. (estar, tú)", "estés", "estás", "Subjunctive — hope (esperar)."),
("Creo que _____ razón. (tener, tú)", "tienes", "tengas", "Indicative — creer (belief)."),
("No creo que _____ razón. (tener, tú)", "tengas", "tienes", "Subjunctive — negated belief."),
("Es importante que _____ puntual. (ser, tú)", "seas", "eres", "Subjunctive — impersonal expression."),
("Ojalá que _____ buen tiempo. (hacer)", "haga", "hace", "Subjunctive — ojalá (wish)."),
("Te pido que _____ silencio. (guardar)", "guardes", "guardas", "Subjunctive — pedir (request)."),
("Es cierto que _____ mucho. (trabajar, ella)", "trabaja", "trabaje", "Indicative — es cierto (certainty)."),
("No es cierto que _____ mucho. (trabajar, ella)", "trabaje", "trabaja", "Subjunctive — negated certainty."),
("Prefiero que _____ tú. (conducir)", "conduzcas", "conduces", "Subjunctive — preferir (preference)."),
("Siento que no _____ venir. (poder, tú)", "puedas", "puedes", "Subjunctive — sentir (emotion)."),
("Es obvio que _____ cansado. (estar, él)", "está", "esté", "Indicative — es obvio (certainty)."),
("Necesito que me _____ un favor. (hacer, tú)", "hagas", "haces", "Subjunctive — necesitar que."),
("Es mejor que _____ temprano. (salir, nosotros)", "salgamos", "salimos", "Subjunctive — es mejor que."),
("Estoy seguro de que _____ bien. (ir, todo)", "va", "vaya", "Indicative — estar seguro (certainty)."),
("Temo que _____ demasiado tarde. (ser)", "sea", "es", "Subjunctive — temer (fear)."),
("Sugiero que _____ más agua. (beber, tú)", "bebas", "bebes", "Subjunctive — sugerir (suggestion)."),
("Es verdad que _____ difícil. (ser)", "es", "sea", "Indicative — es verdad (truth)."),
("No es verdad que _____ difícil. (ser)", "sea", "es", "Subjunctive — negated truth."),
("Quiero que _____ la puerta. (cerrar, tú)", "cierres", "cierras", "Subjunctive — querer."),
("Deseo que _____ feliz. (ser, tú)", "seas", "eres", "Subjunctive — desear (wish)."),
("Es probable que _____ tarde. (llegar, ellos)", "lleguen", "llegan", "Subjunctive — es probable."),
("Es improbable que _____ hoy. (nevar)", "nieve", "nieva", "Subjunctive — es improbable."),
("Me molesta que _____ tanto ruido. (hacer, ellos)", "hagan", "hacen", "Subjunctive — emotion (molestar)."),
("Es evidente que _____ talento. (tener, ella)", "tiene", "tenga", "Indicative — es evidente."),
("Recomiendo que _____ este libro. (leer, tú)", "leas", "lees", "Subjunctive — recomendar."),
("Exijo que _____ a tiempo. (llegar, todos)", "lleguen", "llegan", "Subjunctive — exigir (demand)."),
("Es una lástima que no _____ ir. (poder, tú)", "puedas", "puedes", "Subjunctive — es una lástima."),
("Me sorprende que _____ tan joven. (ser, él)", "sea", "es", "Subjunctive — surprise (emotion)."),
("Insisto en que _____ la verdad. (decir, tú)", "digas", "dices", "Subjunctive — insistir."),
("Es extraño que no _____ aquí. (estar, ella)", "esté", "está", "Subjunctive — es extraño."),
("Prohíbo que _____ en clase. (comer, ustedes)", "coman", "comen", "Subjunctive — prohibir."),
("Permito que _____ temprano. (salir, tú)", "salgas", "sales", "Subjunctive — permitir."),
("Es dudoso que _____ a tiempo. (terminar, nosotros)", "terminemos", "terminamos", "Subjunctive — es dudoso."),
("Pienso que _____ inteligente. (ser, ella)", "es", "sea", "Indicative — pensar (opinion)."),
("No pienso que _____ justo. (ser)", "sea", "es", "Subjunctive — negated opinion."),
("Me encanta que _____ español. (hablar, tú)", "hables", "hablas", "Subjunctive — emotion (encantar)."),
("Es fantástico que _____ aquí. (estar, ustedes)", "estén", "están", "Subjunctive — es fantástico."),
("Mando que _____ inmediatamente. (venir, tú)", "vengas", "vienes", "Subjunctive — mandar."),
("Es ridículo que _____ eso. (pensar, él)", "piense", "piensa", "Subjunctive — es ridículo."),
("Busco a alguien que _____ francés. (hablar)", "hable", "habla", "Subjunctive — nonexistent antecedent."),
("Conozco a alguien que _____ francés. (hablar)", "habla", "hable", "Indicative — known antecedent."),
("No hay nadie que _____ eso. (saber)", "sepa", "sabe", "Subjunctive — negative antecedent."),
("Cuando _____ a casa, llámame. (llegar, tú)", "llegues", "llegas", "Subjunctive — cuando + future."),
("Cuando _____ a casa, siempre como. (llegar, yo)", "llego", "llegue", "Indicative — cuando + habitual."),
("Antes de que _____, quiero decirte algo. (ir, tú)", "te vayas", "te vas", "Subjunctive — antes de que."),
("Después de que _____, descansaremos. (terminar, nosotros)", "terminemos", "terminamos", "Subjunctive — después de que + future."),
("Aunque _____ mucho, iré. (llover)", "llueva", "llueve", "Subjunctive — aunque + hypothetical."),
("Aunque _____ mucho, siempre voy. (llover)", "llueve", "llueva", "Indicative — aunque + factual."),
("Para que _____ bien, debes practicar. (salir, todo)", "salga", "sale", "Subjunctive — para que."),
("Sin que nadie lo _____. (saber)", "sepa", "sabe", "Subjunctive — sin que."),
("Con tal de que _____ contento. (estar, tú)", "estés", "estás", "Subjunctive — con tal de que."),
("A menos que _____ temprano, perderás el tren. (salir, tú)", "salgas", "sales", "Subjunctive — a menos que."),
("En caso de que _____, llámame. (necesitar, tú)", "necesites", "necesitas", "Subjunctive — en caso de que."),
("Mientras _____ aquí, todo estará bien. (estar, yo)", "esté", "estoy", "Subjunctive — mientras + uncertainty."),
("Tan pronto como _____, empezamos. (llegar, él)", "llegue", "llega", "Subjunctive — tan pronto como + future."),
("Hasta que no _____, no me voy. (terminar, tú)", "termines", "terminas", "Subjunctive — hasta que + future."),
("Es hora de que _____ la verdad. (saber, tú)", "sepas", "sabes", "Subjunctive — es hora de que."),
("Espero que _____ un buen día. (tener, tú)", "tengas", "tienes", "Subjunctive — esperar."),
("Dile que _____ aquí. (venir)", "venga", "viene", "Subjunctive — indirect command."),
("No hay nada que _____ hacer. (poder, yo)", "pueda", "puedo", "Subjunctive — negative existence."),
("Es normal que _____ nervioso. (estar, tú)", "estés", "estás", "Subjunctive — es normal que."),
("Me da miedo que _____ sola. (ir, ella)", "vaya", "va", "Subjunctive — emotion (dar miedo)."),
("Es urgente que _____ al doctor. (ir, tú)", "vayas", "vas", "Subjunctive — es urgente."),
("No quiero que _____ tarde. (llegar, tú)", "llegues", "llegas", "Subjunctive — no querer."),
("Tal vez _____ razón. (tener, tú)", "tengas", "tienes", "Subjunctive — tal vez."),
("Quizás _____ mañana. (venir, ella)", "venga", "viene", "Subjunctive — quizás."),
("Es imposible que _____ tan rápido. (terminar, él)", "termine", "termina", "Subjunctive — es imposible."),
("Parece que _____ contento. (estar, él)", "está", "esté", "Indicative — parece que (appears)."),
("No parece que _____ contento. (estar, él)", "esté", "está", "Subjunctive — negated parece."),
("Dice que _____ mañana. (venir)", "viene", "venga", "Indicative — decir reporting fact."),
("Dice que _____ mañana. (venir — as command)", "venga", "viene", "Subjunctive — decir as command."),
("Me preocupa que no _____ bien. (sentirse, tú)", "te sientas", "te sientes", "Subjunctive — emotion (preocupar)."),
("Es raro que _____ tanto calor. (hacer)", "haga", "hace", "Subjunctive — es raro."),
("Confío en que _____ bien. (salir, todo)", "salga", "sale", "Subjunctive — confiar en que."),
("Es fundamental que _____ la tarea. (hacer, ustedes)", "hagan", "hacen", "Subjunctive — es fundamental."),
("Me pone triste que _____ así. (ser, las cosas)", "sean", "son", "Subjunctive — emotion."),
("Aconsejo que _____ más temprano. (acostarse, tú)", "te acuestes", "te acuestas", "Subjunctive — aconsejar."),
("Es bueno que _____ ejercicio. (hacer, tú)", "hagas", "haces", "Subjunctive — es bueno que."),
("Es malo que _____ tanto. (fumar, él)", "fume", "fuma", "Subjunctive — es malo que."),
("Me gusta que _____ aquí. (estar, tú)", "estés", "estás", "Subjunctive — emotion (gustar que)."),
("No creo que _____ la respuesta. (saber, él)", "sepa", "sabe", "Subjunctive — negated belief."),
("Es increíble que _____ tan rápido. (aprender, ella)", "aprenda", "aprende", "Subjunctive — es increíble."),
("Ojala _____ más tiempo. (tener, nosotros)", "tengamos", "tenemos", "Subjunctive — ojalá."),
("Niego que _____ la verdad. (ser, eso)", "sea", "es", "Subjunctive — negar (deny)."),
("Es preciso que _____ ahora. (salir, nosotros)", "salgamos", "salimos", "Subjunctive — es preciso."),
("Te aconsejo que _____ paciencia. (tener)", "tengas", "tienes", "Subjunctive — aconsejar."),
("Basta que _____ una vez. (decir, tú)", "digas", "dices", "Subjunctive — bastar que."),
("Conviene que _____ preparado. (estar, tú)", "estés", "estás", "Subjunctive — convenir que."),
("Es natural que _____ preocupado. (estar, él)", "esté", "está", "Subjunctive — es natural."),
("Ruego que me _____. (perdonar, tú)", "perdones", "perdonas", "Subjunctive — rogar."),
("Es suficiente que _____ una carta. (escribir, tú)", "escribas", "escribes", "Subjunctive — es suficiente que."),
("Me fascina que _____ tantos idiomas. (hablar, ella)", "hable", "habla", "Subjunctive — emotion (fascinar)."),
("Hace falta que _____ más esfuerzo. (poner, nosotros)", "pongamos", "ponemos", "Subjunctive — hacer falta que."),
]
return data.enumerated().map { i, d in
GrammarExercise(id: "st\(i+1)", prompt: "Subjunctive or indicative?", sentence: d.0, correctAnswer: d.1, options: [d.1, d.2].shuffled(), explanation: d.3)
}
}()
// MARK: - Personal A
// MARK: - Personal A (100)
private static let personalAExercises = [
GrammarExercise(id: "pa1", prompt: "Is the personal 'a' needed?", sentence: "Veo _____ María.", correctAnswer: "a", options: ["a", "(nothing)"], explanation: "Personal a needed — María is a specific person as direct object."),
GrammarExercise(id: "pa2", prompt: "Is the personal 'a' needed?", sentence: "Veo _____ la mesa.", correctAnswer: "(nothing)", options: ["a", "(nothing)"], explanation: "No personal a — la mesa is a thing, not a person."),
GrammarExercise(id: "pa3", prompt: "Is the personal 'a' needed?", sentence: "Tengo _____ dos hermanos.", correctAnswer: "(nothing)", options: ["a", "(nothing)"], explanation: "No personal a after tener — important exception."),
GrammarExercise(id: "pa4", prompt: "Is the personal 'a' needed?", sentence: "Conozco _____ tu profesor.", correctAnswer: "a", options: ["a", "(nothing)"], explanation: "Personal a needed — specific person as direct object."),
GrammarExercise(id: "pa5", prompt: "Is the personal 'a' needed?", sentence: "Busco _____ un doctor.", correctAnswer: "(nothing)", options: ["a", "(nothing)"], explanation: "No personal a — non-specific person (any doctor)."),
GrammarExercise(id: "pa6", prompt: "Is the personal 'a' needed?", sentence: "No veo _____ nadie.", correctAnswer: "a", options: ["a", "(nothing)"], explanation: "Personal a with nadie — indefinite pronoun referring to people."),
]
private static let personalAExercises: [GrammarExercise] = {
let data: [(String, String, String, String)] = [
("Veo _____ María.", "a", "(nothing)", "Personal a — specific person as direct object."),
("Veo _____ la mesa.", "(nothing)", "a", "No personal a — thing, not person."),
("Tengo _____ dos hermanos.", "(nothing)", "a", "No personal a after tener."),
("Conozco _____ tu profesor.", "a", "(nothing)", "Personal a — specific person."),
("Busco _____ un doctor.", "(nothing)", "a", "No personal a — non-specific person."),
("No veo _____ nadie.", "a", "(nothing)", "Personal a with nadie."),
("Llamo _____ mi madre.", "a", "(nothing)", "Personal a — specific person."),
("Extraño _____ mis amigos.", "a", "(nothing)", "Personal a — specific people."),
("Necesito _____ un traductor.", "(nothing)", "a", "No personal a — any translator."),
("Necesito _____ mi traductor.", "a", "(nothing)", "Personal a — specific person."),
("¿Conoces _____ alguien aquí?", "a", "(nothing)", "Personal a with alguien."),
("¿_____ quién llamaste?", "A", "(nothing)", "Personal a with quién."),
("Invité _____ Juan a la fiesta.", "a", "(nothing)", "Personal a — specific person."),
("Compré _____ un libro.", "(nothing)", "a", "No personal a — thing."),
("Llevo _____ mi perro al veterinario.", "a", "(nothing)", "Personal a — beloved pet."),
("Quiero _____ mi familia.", "a", "(nothing)", "Personal a — loving people."),
("Leo _____ un libro.", "(nothing)", "a", "No personal a — thing."),
("Escucho _____ mi profesora.", "a", "(nothing)", "Personal a — specific person."),
("Escucho _____ música.", "(nothing)", "a", "No personal a — thing."),
("Busco _____ mi hija.", "a", "(nothing)", "Personal a — specific person."),
("Busco _____ mis llaves.", "(nothing)", "a", "No personal a — things."),
("Vi _____ Carlos en el parque.", "a", "(nothing)", "Personal a — specific person."),
("Vi _____ una película.", "(nothing)", "a", "No personal a — thing."),
("Admiro _____ esa mujer.", "a", "(nothing)", "Personal a — specific person."),
("Tiene _____ tres hijos.", "(nothing)", "a", "No personal a after tener."),
("Ayudo _____ mi vecina.", "a", "(nothing)", "Personal a — specific person."),
("Encontré _____ Pedro en la tienda.", "a", "(nothing)", "Personal a — specific person."),
("Encontré _____ un buen restaurante.", "(nothing)", "a", "No personal a — thing/place."),
("Esperamos _____ nuestros padres.", "a", "(nothing)", "Personal a — specific people."),
("Esperamos _____ el autobús.", "(nothing)", "a", "No personal a — thing."),
("Odio _____ la violencia.", "(nothing)", "a", "No personal a — abstract concept."),
("Odio _____ ese hombre.", "a", "(nothing)", "Personal a — specific person."),
("Contrataron _____ un ingeniero.", "(nothing)", "a", "No personal a — non-specific person."),
("Contrataron _____ María.", "a", "(nothing)", "Personal a — specific person."),
("Cuido _____ mis hijos.", "a", "(nothing)", "Personal a — caring for people."),
("Cuido _____ mi jardín.", "(nothing)", "a", "No personal a — thing."),
("Respeto _____ mis abuelos.", "a", "(nothing)", "Personal a — specific people."),
("Respeto _____ las reglas.", "(nothing)", "a", "No personal a — things."),
("Visité _____ mi tía.", "a", "(nothing)", "Personal a — specific person."),
("Visité _____ el museo.", "(nothing)", "a", "No personal a — place."),
("Abandonó _____ su familia.", "a", "(nothing)", "Personal a — people."),
("Abandonó _____ su coche.", "(nothing)", "a", "No personal a — thing."),
("Presenté _____ mi novio.", "a", "(nothing)", "Personal a — specific person."),
("Traje _____ mi hermano.", "a", "(nothing)", "Personal a — specific person."),
("Traje _____ comida.", "(nothing)", "a", "No personal a — thing."),
("Echamos de menos _____ nuestros amigos.", "a", "(nothing)", "Personal a — missing people."),
("Mandé _____ los niños al colegio.", "a", "(nothing)", "Personal a — sending people."),
("Mandé _____ una carta.", "(nothing)", "a", "No personal a — thing."),
("Saludé _____ la vecina.", "a", "(nothing)", "Personal a — specific person."),
("Abrí _____ la puerta.", "(nothing)", "a", "No personal a — thing."),
("Elegimos _____ un nuevo líder.", "a", "(nothing)", "Personal a — specific person elected."),
("Elegimos _____ un buen restaurante.", "(nothing)", "a", "No personal a — thing."),
("Acusaron _____ el sospechoso.", "a", "(nothing)", "Personal a — specific person."),
("Derribaron _____ el edificio.", "(nothing)", "a", "No personal a — thing."),
("Recogí _____ los niños del colegio.", "a", "(nothing)", "Personal a — picking up people."),
("Recogí _____ mis cosas.", "(nothing)", "a", "No personal a — things."),
("Críticaron _____ el presidente.", "a", "(nothing)", "Personal a — specific person."),
("Critícaron _____ la decisión.", "(nothing)", "a", "No personal a — thing."),
("Perdoné _____ mi amigo.", "a", "(nothing)", "Personal a — specific person."),
("Perdoné _____ su error.", "(nothing)", "a", "No personal a — thing."),
("Describió _____ su madre.", "a", "(nothing)", "Personal a — specific person."),
("Describió _____ la situación.", "(nothing)", "a", "No personal a — thing."),
("Abracé _____ mi abuela.", "a", "(nothing)", "Personal a — specific person."),
("Obedezco _____ mis padres.", "a", "(nothing)", "Personal a — people."),
("Obedezco _____ las leyes.", "(nothing)", "a", "No personal a — things."),
("Felicité _____ mi compañero.", "a", "(nothing)", "Personal a — specific person."),
("Cuidamos _____ nuestro gato.", "a", "(nothing)", "Personal a — beloved pet."),
("Cuidamos _____ la casa.", "(nothing)", "a", "No personal a — thing."),
("Castigaron _____ los culpables.", "a", "(nothing)", "Personal a — specific people."),
("Repararon _____ el techo.", "(nothing)", "a", "No personal a — thing."),
("Defendí _____ mi hermana.", "a", "(nothing)", "Personal a — specific person."),
("Defendí _____ mi posición.", "(nothing)", "a", "No personal a — abstract."),
("Acompañé _____ mi amiga al aeropuerto.", "a", "(nothing)", "Personal a — specific person."),
("Ignoré _____ el comentario.", "(nothing)", "a", "No personal a — thing."),
("Ignoré _____ esa persona.", "a", "(nothing)", "Personal a — specific person."),
("Reconocí _____ Juan inmediatamente.", "a", "(nothing)", "Personal a — specific person."),
("Reconocí _____ la canción.", "(nothing)", "a", "No personal a — thing."),
("Salvaron _____ los pasajeros.", "a", "(nothing)", "Personal a — people."),
("Salvaron _____ los documentos.", "(nothing)", "a", "No personal a — things."),
("Atendemos _____ nuestros clientes.", "a", "(nothing)", "Personal a — people."),
("Atendemos _____ los pedidos.", "(nothing)", "a", "No personal a — things."),
("Despidieron _____ tres empleados.", "a", "(nothing)", "Personal a — people."),
("Pintaron _____ la casa.", "(nothing)", "a", "No personal a — thing."),
("Enseño _____ mis estudiantes.", "a", "(nothing)", "Personal a — people."),
("Enseño _____ español.", "(nothing)", "a", "No personal a — subject/thing."),
("Protegemos _____ los niños.", "a", "(nothing)", "Personal a — people."),
("Protegemos _____ el medio ambiente.", "(nothing)", "a", "No personal a — thing."),
("Entrevisté _____ la candidata.", "a", "(nothing)", "Personal a — specific person."),
("Preparé _____ la cena.", "(nothing)", "a", "No personal a — thing."),
("Culparon _____ los responsables.", "a", "(nothing)", "Personal a — people."),
("Cerraron _____ la tienda.", "(nothing)", "a", "No personal a — thing."),
("Seguí _____ el ladrón.", "a", "(nothing)", "Personal a — specific person."),
("Seguí _____ las instrucciones.", "(nothing)", "a", "No personal a — things."),
("Engañaron _____ los clientes.", "a", "(nothing)", "Personal a — people."),
("Rompieron _____ la ventana.", "(nothing)", "a", "No personal a — thing."),
("Consulté _____ un especialista.", "a", "(nothing)", "Personal a — specific person."),
("Consulté _____ un diccionario.", "(nothing)", "a", "No personal a — thing."),
("Persiguieron _____ los criminales.", "a", "(nothing)", "Personal a — people."),
("Lavé _____ el coche.", "(nothing)", "a", "No personal a — thing."),
("Detuvieron _____ los manifestantes.", "a", "(nothing)", "Personal a — people."),
]
return data.enumerated().map { i, d in
GrammarExercise(id: "pa\(i+1)", prompt: "Is the personal 'a' needed?", sentence: d.0, correctAnswer: d.1, options: [d.1, d.2].shuffled(), explanation: d.3)
}
}()
}

View File

@@ -3,7 +3,7 @@ import SharedModels
import Foundation
actor DataLoader {
static let courseDataVersion = 5
static let courseDataVersion = 6
static let courseDataKey = "courseDataVersion"
/// Quick check: does the DB need seeding or course data refresh?

View File

@@ -16,19 +16,29 @@ final class PronunciationService {
private var recognizerResolved = false
func requestAuthorization() {
// SFSpeechRecognizer.requestAuthorization crashes on simulators
// without speech services. Check availability first.
guard SFSpeechRecognizer.self != nil else { return }
#if targetEnvironment(simulator)
print("[PronunciationService] skipping speech auth on simulator")
isAuthorized = false
return
#else
print("[PronunciationService] requesting speech authorization...")
SFSpeechRecognizer.requestAuthorization { [weak self] status in
print("[PronunciationService] authorization status: \(status.rawValue)")
Task { @MainActor in
self?.isAuthorized = (status == .authorized)
// Check current status first to avoid unnecessary prompt
let currentStatus = SFSpeechRecognizer.authorizationStatus()
if currentStatus == .authorized {
isAuthorized = true
return
}
if currentStatus == .denied || currentStatus == .restricted {
isAuthorized = false
return
}
// Only request if not determined yet do it on a background queue
// to avoid blocking main thread, then update state on main
DispatchQueue.global(qos: .userInitiated).async {
SFSpeechRecognizer.requestAuthorization { status in
DispatchQueue.main.async { [weak self] in
self?.isAuthorized = (status == .authorized)
print("[PronunciationService] authorization status: \(status.rawValue)")
}
}
}
#endif
@@ -40,45 +50,65 @@ final class PronunciationService {
recognizer = SFSpeechRecognizer(locale: Locale(identifier: "es-ES"))
}
func startRecording() throws {
guard isAuthorized else { return }
func startRecording() {
guard isAuthorized else {
print("[PronunciationService] not authorized")
return
}
resolveRecognizerIfNeeded()
guard let recognizer, recognizer.isAvailable else { return }
guard let recognizer, recognizer.isAvailable else {
print("[PronunciationService] recognizer unavailable")
return
}
stopRecording()
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playAndRecord, mode: .measurement, options: [.duckOthers, .defaultToSpeaker])
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
do {
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playAndRecord, mode: .measurement, options: [.duckOthers, .defaultToSpeaker])
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
audioEngine = AVAudioEngine()
request = SFSpeechAudioBufferRecognitionRequest()
audioEngine = AVAudioEngine()
request = SFSpeechAudioBufferRecognitionRequest()
guard let audioEngine, let request else { return }
request.shouldReportPartialResults = true
guard let audioEngine, let request else { return }
request.shouldReportPartialResults = true
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
let inputNode = audioEngine.inputNode
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
request.append(buffer)
}
// Validate format 0 channels crashes installTap
guard recordingFormat.channelCount > 0 else {
print("[PronunciationService] invalid recording format (0 channels)")
self.audioEngine = nil
self.request = nil
return
}
audioEngine.prepare()
try audioEngine.start()
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
guard buffer.frameLength > 0 else { return }
request.append(buffer)
}
transcript = ""
isRecording = true
audioEngine.prepare()
try audioEngine.start()
task = recognizer.recognitionTask(with: request) { [weak self] result, error in
Task { @MainActor in
if let result {
self?.transcript = result.bestTranscription.formattedString
}
if error != nil || (result?.isFinal == true) {
self?.stopRecording()
transcript = ""
isRecording = true
task = recognizer.recognitionTask(with: request) { [weak self] result, error in
DispatchQueue.main.async {
if let result {
self?.transcript = result.bestTranscription.formattedString
}
if error != nil || (result?.isFinal == true) {
self?.stopRecording()
}
}
}
} catch {
print("[PronunciationService] startRecording failed: \(error)")
stopRecording()
}
}

View File

@@ -20,10 +20,16 @@ struct DashboardView: View {
// Summary stats
statsGrid
// Study time + Activity side by side
HStack(alignment: .top, spacing: 12) {
studyTimeCard
streakCalendar
// Study time + Activity side by side on iPad, stacked on iPhone
ViewThatFits(in: .horizontal) {
HStack(alignment: .top, spacing: 12) {
studyTimeCard
streakCalendar
}
VStack(spacing: 12) {
studyTimeCard
streakCalendar
}
}
// Accuracy chart

View File

@@ -3,6 +3,7 @@ import SwiftUI
struct GrammarExerciseView: View {
let noteId: String
let noteTitle: String
@Environment(\.dismiss) private var dismiss
@State private var exercises: [GrammarExercise] = []
@State private var currentIndex = 0
@@ -22,7 +23,7 @@ struct GrammarExerciseView: View {
.adaptiveContainer(maxWidth: 600)
.navigationTitle("Practice: \(noteTitle)")
.navigationBarTitleDisplayMode(.inline)
.onAppear { exercises = GrammarExercise.exercises(for: noteId).shuffled() }
.onAppear { exercises = Array(GrammarExercise.exercises(for: noteId).shuffled().prefix(10)) }
}
@ViewBuilder
@@ -122,6 +123,19 @@ struct GrammarExerciseView: View {
Text(correctCount == exercises.count ? "Perfect!" : "Keep reviewing this topic.")
.font(.title3)
.foregroundStyle(.secondary)
Button {
dismiss()
} label: {
Text("Done")
.font(.headline)
.frame(maxWidth: .infinity)
.padding(.vertical, 12)
}
.buttonStyle(.borderedProminent)
.tint(.purple)
.padding(.horizontal)
Spacer()
}
}

View File

@@ -166,7 +166,7 @@ struct ListeningView: View {
if result.score >= 0.7 { correctCount += 1 }
withAnimation { isRevealed = true }
} else {
try? pronunciation.startRecording()
pronunciation.startRecording()
}
} label: {
Label(pronunciation.isRecording ? "Stop" : "Start Speaking", systemImage: pronunciation.isRecording ? "stop.circle.fill" : "mic.circle.fill")

File diff suppressed because one or more lines are too long

View File

@@ -8486,7 +8486,7 @@
"cards": [
{
"front": "tener",
"back": "tengo",
"back": "tengo — I have",
"examples": [
{
"es": "The Spanish Verb \"Tener\"",
@@ -8504,7 +8504,7 @@
},
{
"front": "venir",
"back": "vengo",
"back": "vengo — I come",
"examples": [
{
"es": "Lo mejor está por venir.",
@@ -8522,7 +8522,7 @@
},
{
"front": "hacer",
"back": "hago",
"back": "hago — I do, I make",
"examples": [
{
"es": "Expressions with \"Hacer\"",
@@ -8540,7 +8540,7 @@
},
{
"front": "salir",
"back": "salgo",
"back": "salgo — I go out",
"examples": [
{
"es": "Usa el ascensor para salir.",
@@ -8558,7 +8558,7 @@
},
{
"front": "caer",
"back": "caigo",
"back": "caigo — I fall",
"examples": [
{
"es": "¡Acabo de caer en que tengo una cita con el dentista en diez minutos!",
@@ -8576,7 +8576,7 @@
},
{
"front": "traer",
"back": "traigo",
"back": "traigo — I bring",
"examples": [
{
"es": "Esto puede traer cambios profundos en bares, discotecas y restaurantes.",
@@ -8594,7 +8594,7 @@
},
{
"front": "poner",
"back": "pongo",
"back": "pongo — I put",
"examples": [
{
"es": "Después de bañar a la bebé, hay que ponerle ropa limpia.",
@@ -8612,7 +8612,7 @@
},
{
"front": "decir",
"back": "digo",
"back": "digo — I say",
"examples": [
{
"es": "¿Jura decir la verdad?",
@@ -8630,7 +8630,7 @@
},
{
"front": "conducir",
"back": "conduzco",
"back": "conduzco — I lead, I drive",
"examples": [
{
"es": "conducir(kohn-doo-seer)",
@@ -8648,7 +8648,7 @@
},
{
"front": "conocer",
"back": "conozco",
"back": "conozco — I know, I meet",
"examples": [
{
"es": "conocer(koh-noh-sehr)",
@@ -8666,7 +8666,7 @@
},
{
"front": "agradecer",
"back": "agradezco",
"back": "agradezco — I thank",
"examples": [
{
"es": "agradecer(ah-grah-deh-sehr)",
@@ -8684,7 +8684,7 @@
},
{
"front": "parecer",
"back": "parezco",
"back": "parezco — I seem",
"examples": [
{
"es": "parecer(pah-reh-sehr)",
@@ -8702,7 +8702,7 @@
},
{
"front": "crecer",
"back": "crezco",
"back": "crezco — I grow",
"examples": [
{
"es": "crecer(kreh-sehr)",
@@ -8720,7 +8720,7 @@
},
{
"front": "producir",
"back": "produzco",
"back": "produzco — I produce",
"examples": [
{
"es": "producir(proh-doo-seer)",
@@ -8738,7 +8738,7 @@
},
{
"front": "traducir",
"back": "traduzco",
"back": "traduzco — I translate",
"examples": [
{
"es": "traducir(trah-doo-seer)",
@@ -8756,7 +8756,7 @@
},
{
"front": "establecer",
"back": "establezco",
"back": "establezco — I establish",
"examples": [
{
"es": "establecer(ehs-tah-bleh-sehr)",
@@ -8774,7 +8774,7 @@
},
{
"front": "elejir",
"back": "elijo",
"back": "elijo — I choose",
"examples": [
{
"es": "En realidad cada persona será libre de elejir su comida.",
@@ -8792,7 +8792,7 @@
},
{
"front": "proteger",
"back": "protejo",
"back": "protejo — I protect",
"examples": [
{
"es": "proteger(proh-teh-hehr)",
@@ -8810,7 +8810,7 @@
},
{
"front": "dirigir",
"back": "dirijo",
"back": "dirijo — I manage, I direct",
"examples": [
{
"es": "dirigir(dee-ree-heer)",
@@ -8828,7 +8828,7 @@
},
{
"front": "fingir",
"back": "finjo",
"back": "finjo — I pretend, I feign",
"examples": [
{
"es": "fingir(feen-heer)",
@@ -8846,7 +8846,7 @@
},
{
"front": "sumergir",
"back": "sumerjo",
"back": "sumerjo — I submerge",
"examples": [
{
"es": "sumergir(soo-mehr-heer)",
@@ -8864,7 +8864,7 @@
},
{
"front": "ver",
"back": "veo",
"back": "veo — I see",
"examples": [
{
"es": "¿Quieres ver mi carro nuevo?",
@@ -8882,7 +8882,7 @@
},
{
"front": "saber",
"back": "sé",
"back": "sé — I know, I taste",
"examples": [
{
"es": "El saber popular se basa en creencias.",
@@ -8900,7 +8900,7 @@
},
{
"front": "distinguir",
"back": "distingo",
"back": "distingo — I distinguish",
"examples": [
{
"es": "distinguir(dees-teeng-geer)",
@@ -8918,7 +8918,7 @@
},
{
"front": "oír",
"back": "oigo",
"back": "oigo — I hear",
"examples": [
{
"es": "Me quejé a mucha gente, pero nadie quiso oírme.",
@@ -8943,7 +8943,7 @@
"cards": [
{
"front": "tener",
"back": "tengo",
"back": "tengo — I have",
"examples": [
{
"es": "The Spanish Verb \"Tener\"",
@@ -8961,7 +8961,7 @@
},
{
"front": "venir",
"back": "vengo",
"back": "vengo — I come",
"examples": [
{
"es": "Lo mejor está por venir.",
@@ -8979,7 +8979,7 @@
},
{
"front": "hacer",
"back": "hago",
"back": "hago — I do, I make",
"examples": [
{
"es": "Expressions with \"Hacer\"",
@@ -8997,7 +8997,7 @@
},
{
"front": "salir",
"back": "salgo",
"back": "salgo — I go out",
"examples": [
{
"es": "Usa el ascensor para salir.",
@@ -9015,7 +9015,7 @@
},
{
"front": "caer",
"back": "caigo",
"back": "caigo — I fall",
"examples": [
{
"es": "¡Acabo de caer en que tengo una cita con el dentista en diez minutos!",
@@ -9033,7 +9033,7 @@
},
{
"front": "traer",
"back": "traigo",
"back": "traigo — I bring",
"examples": [
{
"es": "Esto puede traer cambios profundos en bares, discotecas y restaurantes.",
@@ -9051,7 +9051,7 @@
},
{
"front": "poner",
"back": "pongo",
"back": "pongo — I put",
"examples": [
{
"es": "Después de bañar a la bebé, hay que ponerle ropa limpia.",
@@ -9069,7 +9069,7 @@
},
{
"front": "decir",
"back": "digo",
"back": "digo — I say",
"examples": [
{
"es": "¿Jura decir la verdad?",
@@ -9087,7 +9087,7 @@
},
{
"front": "conducir",
"back": "conduzco",
"back": "conduzco — I lead, I drive",
"examples": [
{
"es": "conducir(kohn-doo-seer)",
@@ -9105,7 +9105,7 @@
},
{
"front": "conocer",
"back": "conozco",
"back": "conozco — I know, I meet",
"examples": [
{
"es": "conocer(koh-noh-sehr)",
@@ -9123,7 +9123,7 @@
},
{
"front": "agradecer",
"back": "agradezco",
"back": "agradezco — I thank",
"examples": [
{
"es": "agradecer(ah-grah-deh-sehr)",
@@ -9141,7 +9141,7 @@
},
{
"front": "parecer",
"back": "parezco",
"back": "parezco — I seem",
"examples": [
{
"es": "parecer(pah-reh-sehr)",
@@ -9159,7 +9159,7 @@
},
{
"front": "crecer",
"back": "crezco",
"back": "crezco — I grow",
"examples": [
{
"es": "crecer(kreh-sehr)",
@@ -9177,7 +9177,7 @@
},
{
"front": "producir",
"back": "produzco",
"back": "produzco — I produce",
"examples": [
{
"es": "producir(proh-doo-seer)",
@@ -9195,7 +9195,7 @@
},
{
"front": "traducir",
"back": "traduzco",
"back": "traduzco — I translate",
"examples": [
{
"es": "traducir(trah-doo-seer)",
@@ -9213,7 +9213,7 @@
},
{
"front": "establecer",
"back": "establezco",
"back": "establezco — I establish",
"examples": [
{
"es": "establecer(ehs-tah-bleh-sehr)",
@@ -9231,7 +9231,7 @@
},
{
"front": "elejir",
"back": "elijo",
"back": "elijo — I choose",
"examples": [
{
"es": "En realidad cada persona será libre de elejir su comida.",
@@ -9249,7 +9249,7 @@
},
{
"front": "proteger",
"back": "protejo",
"back": "protejo — I protect",
"examples": [
{
"es": "proteger(proh-teh-hehr)",
@@ -9267,7 +9267,7 @@
},
{
"front": "dirigir",
"back": "dirijo",
"back": "dirijo — I manage, I direct",
"examples": [
{
"es": "dirigir(dee-ree-heer)",
@@ -9285,7 +9285,7 @@
},
{
"front": "fingir",
"back": "finjo",
"back": "finjo — I pretend, I feign",
"examples": [
{
"es": "fingir(feen-heer)",
@@ -9303,7 +9303,7 @@
},
{
"front": "sumergir",
"back": "sumerjo",
"back": "sumerjo — I submerge",
"examples": [
{
"es": "sumergir(soo-mehr-heer)",
@@ -9321,7 +9321,7 @@
},
{
"front": "ver",
"back": "veo",
"back": "veo — I see",
"examples": [
{
"es": "¿Quieres ver mi carro nuevo?",
@@ -9339,7 +9339,7 @@
},
{
"front": "saber",
"back": "sé",
"back": "sé — I know, I taste",
"examples": [
{
"es": "El saber popular se basa en creencias.",
@@ -9357,7 +9357,7 @@
},
{
"front": "distinguir",
"back": "distingo",
"back": "distingo — I distinguish",
"examples": [
{
"es": "distinguir(dees-teeng-geer)",
@@ -9375,7 +9375,7 @@
},
{
"front": "oír",
"back": "oigo",
"back": "oigo — I hear",
"examples": [
{
"es": "Me quejé a mucha gente, pero nadie quiso oírme.",