The last of the UX review's item 8. Ctrl+. and Ctrl+, step through the underlines from anywhere in the text; the card that opens takes focus and answers Tab / Shift+Tab / Enter / Del / ? / Esc itself. Answering a card advances to the next by itself, and the last one closes and puts the caret back in the prose — so a document is triaged in five presses of Enter. The item asked for bare Tab or n/p. Neither can exist in a text editor: an unmodified letter is a letter. They work fine once a card holds focus, which is where the item wanted them; getting there needs a chord that is safe to press mid-sentence, and mid-composition, so the entry keys are IME-guarded like every other binding. The queue is the underlines read off the decoration DOM in document order, not the suggestion list: a stop she cannot see is worse than one she never visits, and it guarantees the card can anchor itself. Escape is stopped at the card. Unhandled it would also have left distraction-free mode, restoring the sidebar and — via the rail-follows-the- mode fix — pulling the rail out from under her mid-triage. The legend is bilingual and leads with the pair language, unlike the card's English buttons: those name what she is learning, this is an instruction for operating Petal, like the status bar. Key names are as printed on her keyboard (Entrée, Suppr, Intro, Supr). The es pack's own punctuation test caught the "?" and is right in general; the key cap is one named exemption. Verified in a real browser at 1517x810 on a fresh database with no model, over CDP — a keystroke feature deserves real keystrokes. Both layouts, wrap in both directions, the accept/dismiss/advance loop, Ask Petal and back, the full triage-to-empty criterion, and Accept-all clicked from a keyboard card. The wiring has no unit test for the reason items 6, 7 and 8 recorded: jsdom has no layout. triage.ts is pure and tested; browser-verified is written down as browser-verified. Claude-Session: https://claude.ai/code/session_01GJHNvirh7Hzhc9RL3HAvz7
556 lines
31 KiB
TypeScript
556 lines
31 KiB
TypeScript
// The Spanish pack — the fourth pair, and the second written straight into the
|
||
// groove Phase 24 cut.
|
||
//
|
||
// ⚠️ REVIEWED BY FOUR MODELS, NOT BY A NATIVE SPEAKER.
|
||
// SUGGESTIONS.md §3 sets the bar: a pack should be reviewed by someone who
|
||
// speaks the pair before it is trusted. That has still not happened. What has
|
||
// happened (2026-07-28) is the same interim pass the fr and pt-PT packs got —
|
||
// four models read this file independently as Latin American Spanish speakers,
|
||
// and only findings at least two of them reached on their own were applied,
|
||
// listed in BUILD_PLAN Phase 25. A quorum of models agreeing is agreement, not
|
||
// authority: it can catch a verb form no one says and a register that slips into
|
||
// Spain, and it cannot catch a line that is correct and lifeless. Treat this as a
|
||
// better-checked draft.
|
||
//
|
||
// The choices this file makes, and why:
|
||
//
|
||
// * **Latin American neutral, not peninsular.** Chosen deliberately (user,
|
||
// 2026-07-28) over es-ES: it is the Spanish far more people write, and the
|
||
// "neutral" register is a real thing that Spanish-language publishing and
|
||
// dubbing have spent decades stabilising. So: *tú* for the singular,
|
||
// **ustedes** for the plural and no *vosotros* anywhere, and the pan-American
|
||
// half of every vocabulary split — *computadora*, *celular*, *carro*, *jugo*,
|
||
// *papa*, *departamento*, *lentes*, *boleto*. A vitest greps this file for the
|
||
// peninsular twins the way the fr pack is grepped for québécismes, because a
|
||
// stray *ordenador* is invisible to everyone reviewing the diff.
|
||
// * **The dictionary makes the opposite choice on purpose, and that is not a
|
||
// contradiction.** This copy is Latin American; the spelling dictionary
|
||
// behind it accepts *every* variety of Spanish, peninsular and voseante
|
||
// alike (RLA's generic build — see web/public/dictionaries/es/LICENSE). The
|
||
// two answer different questions: the copy is Petal *speaking*, where a
|
||
// register has to be chosen, and the dictionary is Petal *listening*, where
|
||
// the only available action is to underline something. Choosing a register
|
||
// to write in costs a reader nothing; choosing one to accept would tell her
|
||
// that her own conjugation is a typo.
|
||
// * **Tuteo.** Petal is a companion in someone's private notebook, and *usted*
|
||
// would put a desk between them — the same call the pt-PT pack made about
|
||
// *tu* over *você* and the fr pack about *tu* over *vous*.
|
||
// * **Tuteo here, voseo accepted there.** This copy says *tú*, because neutral
|
||
// Latin American is tuteo and something had to be chosen. The dictionary
|
||
// nonetheless accepts *vení* and *tenés*, so a Rioplatense writer is never
|
||
// told her own present tense is a misspelling — she simply reads a companion
|
||
// that speaks a slightly different Spanish than she writes, which is true of
|
||
// every Spanish speaker reading anything.
|
||
// * **¿Inverted marks, siempre!** Spanish opens questions and exclamations and
|
||
// this file does too — including inside interpolated lines, where it is
|
||
// easiest to forget. It is also the one punctuation habit that costs her
|
||
// nothing in English: unlike the French space before « ! », there is no
|
||
// Spanish mark to carry across by accident, so no prose note has to warn
|
||
// about it.
|
||
// * Quotation marks are the curly “ ” rather than « », which is the American
|
||
// convention and the commoner one in Spanish outside Spain.
|
||
//
|
||
// Spanish first, English underneath — same shape as the other packs, for the same
|
||
// reason: she reads her own language faster, and the English half is what she is
|
||
// here to learn.
|
||
|
||
import type { Pack } from '../types'
|
||
|
||
export const es: Pack = {
|
||
code: 'es',
|
||
nativeName: 'Español',
|
||
// Mexican Spanish is the standard "neutral" broadcast variety and the one
|
||
// Piper has a Latin American voice for (es_MX-ald-medium). The peninsular
|
||
// es_ES-davefx-medium the plan originally named would have read this copy in
|
||
// the accent it was written to avoid.
|
||
locale: 'es-MX',
|
||
|
||
app: {
|
||
duplicateTitle: (title) => `${title} (copia)`,
|
||
garden: 'Jardín de palabras',
|
||
history: 'Historial',
|
||
},
|
||
|
||
auth: {
|
||
title: 'Vuelve a entrar',
|
||
titleEn: 'Please sign in again',
|
||
bodyWithDraft:
|
||
'Lo que acabas de escribir está guardado en este dispositivo — vuelve a entrar y se guardará solo.',
|
||
bodyWithDraftEn: "What you just wrote is safe on this device — it'll save itself once you're back in.",
|
||
bodyPlain: 'Tu sesión expiró. Todo lo que escribiste ya está guardado.',
|
||
bodyPlainEn: 'Your session expired. Everything you wrote is already saved.',
|
||
signIn: 'Iniciar sesión · Sign in',
|
||
},
|
||
|
||
companion: {
|
||
choose: 'Elige un compañero · Choose a companion',
|
||
|
||
encouragements: [
|
||
{ native: '¡Eso! Esa oración fluye mucho mejor 🌸', en: 'Lovely — that reads so much smoother now.' },
|
||
{ native: 'Cada vez escribes mejor ✨', en: "You're getting better and better." },
|
||
{ native: 'Me gusta mucho ese cambio 💕', en: 'I really like that change.' },
|
||
{ native: '¡Sigue así, lo estás logrando!', en: 'Keep going — you’ve got this!' },
|
||
{ native: 'Mmm, así queda mucho más claro 👍', en: 'Mm, that’s much clearer.' },
|
||
{ native: '¡Qué linda elección de palabra! 🌷', en: 'That’s such a good word choice.' },
|
||
{ native: 'Ay, ese párrafo se lee solito ☁️', en: 'Ooh, that paragraph flows so nicely.' },
|
||
{ native: 'Me encanta verte escribir con más confianza 💛', en: 'I love watching you write with more confidence.' },
|
||
{ native: 'Cada avance cuenta, por chiquito que sea 🌱', en: 'Every little bit of progress counts.' },
|
||
{ native: 'Hoy tus palabras están brillando ✨', en: 'Your words are sparkling today.' },
|
||
],
|
||
|
||
tips: [
|
||
{ native: 'Consejo: en inglés, las oraciones cortas se leen mejor.', en: 'Tip: shorter English sentences often read clearer.' },
|
||
{ native: 'No olvides los artículos “the” y “a”.', en: "Don't forget articles like “the” and “a”." },
|
||
{ native: 'Para el pasado, usa el pretérito: go → went.', en: 'For the past, use past tense: go → went.' },
|
||
{ native: 'Leer en voz alta ayuda a notar lo que suena raro.', en: 'Reading aloud helps you catch awkward spots.' },
|
||
{ native: 'Una idea por párrafo y todo queda clarito.', en: 'One idea per paragraph keeps it tidy.' },
|
||
{ native: '¿Tienes una duda? Pregúntame ✨', en: 'Not sure about something? Just ask me. ✨' },
|
||
{ native: 'El plural lleva “s”: two apples 🍎', en: 'Plurals take an “s”: two apples 🍎' },
|
||
// Two tips the zh pack has no use for. Spanish and English share so much
|
||
// Latin vocabulary that the false friends are a daily hazard, and the
|
||
// subject pronoun is the habit Spanish speakers drop most often.
|
||
{ native: 'Cuidado con los falsos amigos: “actually” no significa *actualmente*.', en: 'Careful with false friends — “actually” means *in fact*.' },
|
||
{ native: 'En inglés el sujeto casi nunca se omite: “it is raining”, no “is raining”.', en: 'English almost always needs a subject: “it is raining”, not “is raining”.' },
|
||
],
|
||
|
||
breaks: [
|
||
{ native: 'Llevas rato escribiendo — estírate y descansa la vista 🍵', en: "You've been writing a while — stretch and rest your eyes. 🍵" },
|
||
{ native: '¿Un vaso de agua y cinco minutos de pausa?', en: 'Sip some water and take five?' },
|
||
{ native: 'Mira a lo lejos un momento, la vista te lo agradece 🌿', en: 'Look into the distance for a moment — give your eyes a break. 🌿' },
|
||
],
|
||
|
||
// Late-night nudges. The English wit is the user's own and is kept word for
|
||
// word across every pack; the Spanish line leads gently into it, exactly as
|
||
// the Mandarin, Portuguese and French ones do.
|
||
bedtime: [
|
||
{ native: 'Tu cama ha de estar preguntándose dónde andas 🛏️', en: 'I bet your bed is missing you right now.' },
|
||
{ native: 'Cansada, escribes mal — ve a descansar 🌙', en: 'A tired writer is a bad writer — get some rest.' },
|
||
{ native: 'Mejor consúltalo con la almohada ✨', en: 'Sleep is a wondrous enabler.' },
|
||
{ native: '¿Oyes? No… porque todos están dormidos, y tú deberías estarlo también 😴', en: "Hear that? No… you don't, because everyone is sleeping and you should be too." },
|
||
// Spanish sayings about sleep and haste, in place of the French and
|
||
// Portuguese ones — a pack is not a translation of another pack.
|
||
{ native: 'Dormir es el mejor remedio.', en: 'Sleep is the best medicine.' },
|
||
{ native: 'A quien madruga, Dios lo ayuda.', en: 'The early riser gets a hand from above.' },
|
||
{ native: 'No por mucho madrugar amanece más temprano.', en: 'Rising earlier will not make the sun come up sooner.' },
|
||
],
|
||
|
||
greeting: { native: '¡Hola! Aquí te hago compañía 🐱', en: "Hi! I'm right here keeping you company. 🐱" },
|
||
welcomeBack: { native: '¡Volviste! ✨ Sigamos', en: 'Welcome back ✨ let’s keep going!' },
|
||
|
||
errors: [
|
||
{ native: 'Uy — un tropiezo chiquito, pero tus palabras están a salvo.', en: 'Oops — a little hiccup, but your words are safe.' },
|
||
{ native: 'Ay, me enredé un segundo — ya vuelvo.', en: 'Haiya, I got stuck for a sec — back in a moment.' },
|
||
{ native: 'No te preocupes, lo intentamos de nuevo en un ratito 🍵', en: "Don't worry — let's try again in a bit. 🍵" },
|
||
],
|
||
|
||
milestone: (words: number) => ({
|
||
native: `¡Guau! Ya llevas ${words} palabras 🎉`,
|
||
en: `Wow — ${words} words already! Amazing. 🎉`,
|
||
}),
|
||
|
||
// Algo pequeño que escribir, ofrecido una vez al día a una página en blanco.
|
||
// Recuerdos y opiniones, nunca ejercicios: aquí no hay nada que se pueda
|
||
// reprobar, y esa es justamente la intención.
|
||
invitations: [
|
||
{ native: 'Escribe 50 palabras: algo pequeño que te hizo sonreír hoy 🌸', en: 'Write 50 words: one small thing that made you smile today.' },
|
||
{ native: 'Escribe 50 palabras: lo más rico que comiste hoy', en: 'Write 50 words: the best thing you ate today.' },
|
||
{ native: 'Escribe 50 palabras: lo que ves por tu ventana en este momento', en: 'Write 50 words: what you can see out of your window right now.' },
|
||
{ native: 'Escribe 50 palabras: un lugar al que volverías con gusto', en: 'Write 50 words: somewhere you would happily go back to.' },
|
||
{ native: 'Escribe 50 palabras: algo que aprendiste esta semana', en: 'Write 50 words: one thing you learned this week.' },
|
||
{ native: 'Escribe 50 palabras: un mensaje para ti misma dentro de un año', en: 'Write 50 words: something to tell yourself a year from now.' },
|
||
{ native: 'Escribe 50 palabras: una canción que no has parado de escuchar estos días', en: 'Write 50 words: a song you have had on lately.' },
|
||
{ native: 'Escribe 50 palabras: alguien a quien te gustaría agradecerle hoy', en: 'Write 50 words: someone you would like to thank today.' },
|
||
],
|
||
inviteAccept: 'Vamos · Let’s write',
|
||
inviteDecline: 'Hoy no · Not today',
|
||
declined: { native: 'Está bien, me regreso a dormir 😴', en: 'Fair enough — back to my nap. 😴' },
|
||
|
||
names: {
|
||
cat: 'Gato dormilón',
|
||
dog: 'Perro alegre',
|
||
'wiggle-dog': 'Perro meneacola',
|
||
butterfly: 'Mariposa',
|
||
parrot: 'Loro',
|
||
},
|
||
},
|
||
|
||
prose: {
|
||
longSentence: 'Esta oración quedó un poco larga — partirla en dos o tres la hace más clara 🌸',
|
||
commaSplice: 'Aquí hay dos oraciones unidas solo por una coma. Pon un punto, o únelas con “and / but”.',
|
||
vagueThis: (word) => `No queda claro a qué se refiere “${word}” — precísalo (por ejemplo “${word} idea / change…”).`,
|
||
oxfordComma: 'En una lista de tres o más elementos, una coma antes de “and / or” ayuda a leer (la coma de Oxford).',
|
||
transitionComma: (word) => `Después de un conector al inicio de la oración va una coma: “${word}, …”.`,
|
||
capitalizeSentence: 'Empieza cada oración con mayúscula.',
|
||
repeatedWord: (word) => `Parece que “${word}” quedó escrito dos veces — échale un ojo.`,
|
||
capitalizeI: 'En inglés, “I” (yo) siempre va con mayúscula.',
|
||
spaceBeforePunct: 'En inglés no se deja espacio antes de la puntuación: la coma y el punto van pegados a la palabra, igual que en español.',
|
||
spaceAfterPunct: 'Después de una coma o un punto, deja un espacio antes de la siguiente palabra.',
|
||
articleAn: (word) => `Antes de un sonido de vocal se usa “an”: “an ${word}”.`,
|
||
articleA: (word) => `Antes de un sonido de consonante se usa “a”: “a ${word}”.`,
|
||
uncountable: (word, singular) => `“${word}” es incontable en inglés — no lleva s, basta con “${singular}”.`,
|
||
capitalizeProper: (fixed) => `En inglés, los idiomas, las nacionalidades, los días y los meses van con mayúscula: “${fixed}”.`,
|
||
thirdPersonS: (subject, verb) => `Con he/she/it, el verbo lleva -s: “${subject} ${verb}”.`,
|
||
pluralAfter: (determiner, noun) => `Después de “${determiner}”, el sustantivo va en plural: “${determiner} ${noun}s”.`,
|
||
doubleDeterminer: (first, second) => `“${first} ${second}” lleva dos determinantes — deja solo uno (quita “${first}”, por ejemplo).`,
|
||
thereArePlural: (noun) => `En plural se dice “there are”: “there are ${noun}…”.`,
|
||
itsOwn: '“it’s” = “it is”. Para decir “su”, es “its” — o sea “its own”.',
|
||
itsIs: (rest) => `Aquí va “it’s ${rest}” (it is); “its” es el posesivo.`,
|
||
thanNotThen: (word) => `En una comparación se escribe “than”, no “then”: “${word} than”.`,
|
||
preposition: (wrong, right) => `En inglés se dice “${right}”, no “${wrong}” — esa preposición es fija.`,
|
||
collocation: (wrong, right) => `En inglés estas palabras van juntas así: “${right}”, y no “${wrong}”.`,
|
||
doubleComparative: (lead, word) => `“${word}” ya es el comparativo — no necesita “${lead}”: con “${word}” basta.`,
|
||
peopleArePlural: (verb) => `“People” es plural en inglés: “people ${verb}”.`,
|
||
// Interferencia del español. Las tres primeras son las que de verdad se ven
|
||
// todos los días; el resto las tiene el pack aunque este par no las corra.
|
||
ageIsNotHave: (years) => `En inglés la edad se dice con *to be*, no con *tener*: “I am ${years} years old”.`,
|
||
agreeIsAVerb: '“Agree” ya es el verbo — no lleva *to be* delante: se dice “I agree”, no “I am agree”.',
|
||
forNotSince: (duration) => `Para una duración se usa “for”: “for ${duration}”. “Since” marca el punto de partida (since 2020).`,
|
||
veryBeforeVerb: (verb) => `“Very” solo acompaña adjetivos, no verbos: “really ${verb}”, o “${verb}… very much”.`,
|
||
turnOnNotOpen: (thing, on) => `En inglés los aparatos no se abren, se encienden: “turn ${on ? 'on' : 'off'} the ${thing}”.`,
|
||
althoughOrBut: (word) => `En inglés se pone “${word}” o “but”, nunca los dos en la misma oración.`,
|
||
},
|
||
|
||
// Los falsos amigos entre el español y el inglés — la trampa que hace sentir
|
||
// ridícula en vez de simplemente corregida. Por eso son solo un aviso: Petal
|
||
// nunca cambia la palabra, porque “actually” bien pudo ser la que quería.
|
||
//
|
||
// El español comparte tanto latín con el inglés que esta lista es la más larga
|
||
// de los cuatro packs, y *embarrassed* es la razón por la que existe la función.
|
||
falseFriends: {
|
||
embarrassed: {
|
||
native: '“Embarrassed” significa *apenada, avergonzada*. *Embarazada* se dice “pregnant”.',
|
||
en: '“Embarrassed” means ashamed; the Spanish *embarazada* is “pregnant”.',
|
||
},
|
||
actually: {
|
||
native: '“Actually” significa *en realidad*, no *actualmente*. Para *actualmente* se dice “currently” o “nowadays”.',
|
||
en: '“Actually” means *in fact*. For the Spanish *actualmente*, English uses “currently”.',
|
||
},
|
||
eventually: {
|
||
native: '“Eventually” significa *al final, tarde o temprano* — no *eventualmente*. Para eso: “possibly” o “if necessary”.',
|
||
en: '“Eventually” means *in the end*, not *possibly*.',
|
||
},
|
||
realize: {
|
||
native: '“Realize” significa *darse cuenta*. Para *realizar* (llevar a cabo) se dice “carry out” o “do”.',
|
||
en: '“Realize” means to become aware; *realizar* is “to carry out”.',
|
||
},
|
||
assist: {
|
||
native: '“Assist” significa *ayudar*. Para *asistir* (ir a algo) se dice “attend”.',
|
||
en: '“Assist” means to help; *asistir a* is “to attend”.',
|
||
},
|
||
attend: {
|
||
native: '“Attend” significa *asistir a*. Para *atender* (a alguien) se dice “serve” o “take care of”.',
|
||
en: '“Attend” means to go to something; *atender* is “to serve”.',
|
||
},
|
||
support: {
|
||
native: '“Support” significa *apoyar*. Para *soportar* (aguantar algo molesto) se dice “put up with” o “bear”.',
|
||
en: '“Support” means to back someone up; *soportar* is “to put up with”.',
|
||
},
|
||
sensible: {
|
||
native: '“Sensible” significa *sensato*. Para *sensible* se dice “sensitive”.',
|
||
en: '“Sensible” means level-headed; the Spanish *sensible* is “sensitive”.',
|
||
},
|
||
sympathetic: {
|
||
native: '“Sympathetic” significa *comprensivo, solidario*. Para *simpático* se dice “nice” o “friendly”.',
|
||
en: '“Sympathetic” means understanding; *simpático* is “nice”.',
|
||
},
|
||
library: {
|
||
native: '“Library” es la *biblioteca*. La *librería* se dice “bookshop” o “bookstore”.',
|
||
en: '“Library” is where books are lent; a shop that sells them is a “bookstore”.',
|
||
},
|
||
exit: {
|
||
native: '“Exit” es la *salida*. El *éxito* se dice “success”.',
|
||
en: '“Exit” is the way out; *éxito* is “success”.',
|
||
},
|
||
success: {
|
||
native: '“Success” es el *éxito*. Un *suceso* se dice “event”.',
|
||
en: '“Success” is achievement; a Spanish *suceso* is an “event”.',
|
||
},
|
||
carpet: {
|
||
native: '“Carpet” es la *alfombra*. Una *carpeta* se dice “folder”.',
|
||
en: '“Carpet” covers a floor; a *carpeta* is a “folder”.',
|
||
},
|
||
discussion: {
|
||
native: '“Discussion” es una *conversación*, sin pelea. Una *discusión* (riña) se dice “argument”.',
|
||
en: '“Discussion” is calm; a Spanish *discusión* is an “argument”.',
|
||
},
|
||
argument: {
|
||
native: '“Argument” es una *discusión* o *pelea*. El *argumento* de una historia se dice “plot”.',
|
||
en: '“Argument” is a quarrel; the *argumento* of a story is its “plot”.',
|
||
},
|
||
introduce: {
|
||
native: '“Introduce” es *presentar* a alguien. Para *introducir* (meter) se dice “insert” o “put in”.',
|
||
en: '“Introduce” is to present someone; *introducir* is “to insert”.',
|
||
},
|
||
molest: {
|
||
native: '“Molest” significa *abusar sexualmente* — nunca se usa por *molestar*. Para eso: “bother” o “annoy”.',
|
||
en: '“Molest” means to abuse; the everyday *molestar* is “to bother”.',
|
||
},
|
||
constipated: {
|
||
native: '“Constipated” significa *estreñida*. Para *constipada* (resfriada) se dice “to have a cold”.',
|
||
en: '“Constipated” is a bowel problem; *constipado* is “a cold”.',
|
||
},
|
||
large: {
|
||
native: '“Large” significa *grande*. Para *largo* se dice “long”.',
|
||
en: '“Large” means big; *largo* is “long”.',
|
||
},
|
||
lecture: {
|
||
native: '“Lecture” es una *conferencia* o *clase*. La *lectura* se dice “reading”.',
|
||
en: '“Lecture” is a talk; *lectura* is “reading”.',
|
||
},
|
||
parents: {
|
||
native: '“Parents” son los *padres*. Los *parientes* se dicen “relatives”.',
|
||
en: '“Parents” are your mother and father; *parientes* are “relatives”.',
|
||
},
|
||
record: {
|
||
native: '“Record” significa *grabar* o *registrar*. Para *recordar* se dice “remember”.',
|
||
en: '“Record” means to register; *recordar* is “to remember”.',
|
||
},
|
||
remove: {
|
||
native: '“Remove” significa *quitar*. Para *remover* (revolver) se dice “stir”.',
|
||
en: '“Remove” means to take away; *remover* is “to stir”.',
|
||
},
|
||
rope: {
|
||
native: '“Rope” es la *cuerda*. La *ropa* se dice “clothes”.',
|
||
en: '“Rope” is cord; *ropa* is “clothes”.',
|
||
},
|
||
once: {
|
||
native: '“Once” significa *una vez*. El número *once* se dice “eleven”.',
|
||
en: '“Once” means one time; the Spanish *once* is “eleven”.',
|
||
},
|
||
question: {
|
||
native: '“Question” es una *pregunta*. Una *cuestión* (asunto) se dice “matter” o “issue”.',
|
||
en: '“Question” is something you ask; a *cuestión* is a “matter”.',
|
||
},
|
||
compromise: {
|
||
native: '“Compromise” es un *acuerdo con concesiones*. Un *compromiso* (obligación) se dice “commitment”.',
|
||
en: '“Compromise” is meeting halfway; a *compromiso* is a “commitment”.',
|
||
},
|
||
career: {
|
||
native: '“Career” es la *trayectoria profesional*. La *carrera* que se estudia se dice “degree” o “major”.',
|
||
en: '“Career” is your working life; a university *carrera* is a “degree”.',
|
||
},
|
||
ultimately: {
|
||
native: '“Ultimately” significa *a fin de cuentas*. Para *últimamente* se dice “lately”.',
|
||
en: '“Ultimately” means in the end; *últimamente* is “lately”.',
|
||
},
|
||
idiom: {
|
||
native: '“Idiom” es una *expresión hecha*. El *idioma* se dice “language”.',
|
||
en: '“Idiom” is a set phrase; *idioma* is “language”.',
|
||
},
|
||
deception: {
|
||
native: '“Deception” significa *engaño*. La *decepción* se dice “disappointment”.',
|
||
en: '“Deception” means being misled; *decepción* is “disappointment”.',
|
||
},
|
||
pretend: {
|
||
native: '“Pretend” significa *fingir*. Para *pretender* (aspirar a) se dice “intend” o “claim”.',
|
||
en: '“Pretend” means to fake; *pretender* is “to intend”.',
|
||
},
|
||
},
|
||
|
||
docs: {
|
||
sortRecent: 'Recientes · Recent',
|
||
sortTitle: 'Título · Title',
|
||
sortLongest: 'Los más largos · Longest',
|
||
backUpAll: 'Respaldar todo · Back up all:',
|
||
signOut: 'Cerrar sesión · Sign out',
|
||
duplicate: 'Duplicar · Duplicate',
|
||
searchPlaceholder: 'Buscar · Search',
|
||
searching: 'Buscando… · Searching…',
|
||
noMatches: 'Sin resultados · No matches',
|
||
tags: 'Etiquetas · Tags',
|
||
newTagPlaceholder: 'Nueva etiqueta · New tag',
|
||
language: 'Idioma · Language',
|
||
languageFailed: 'No se pudo cambiar el idioma — sigue igual · Couldn’t switch',
|
||
},
|
||
|
||
editor: {
|
||
askPlaceholder: 'Ask why… / Pregunta por qué…',
|
||
chatFailed: 'No logré responder — vuelve a preguntarme, por favor. 🌸\n\nI had trouble answering just now — please ask me again. 🌸',
|
||
findPlaceholder: 'Buscar · Find',
|
||
findNone: 'Nada · 0',
|
||
matchCase: 'Match case · Distinguir mayúsculas',
|
||
close: 'Close · Cerrar',
|
||
replacePlaceholder: 'Reemplazar por · Replace',
|
||
replace: 'Reemplazar',
|
||
replaceAll: 'Todo',
|
||
translateLabel: 'Traducción · Translate',
|
||
// Intro, Supr, Esc — as they are printed on a Spanish keyboard.
|
||
triageHint: {
|
||
native: 'Tab siguiente · Intro aceptar · Supr descartar · ? preguntar a Petal · Esc salir',
|
||
en: 'Tab next · Enter accept · Del dismiss · ? Ask Petal · Esc exit',
|
||
},
|
||
spelling: 'Ortografía · Spelling',
|
||
noSuggestions: 'Sin sugerencias · No suggestions',
|
||
addToDictionary: 'Agregar al diccionario · Add to dictionary',
|
||
readSelection: 'Leer la selección en voz alta · Read selection aloud',
|
||
rewrite: 'Reescribir · Rewrite',
|
||
rewriting: 'Reescribiendo… · Rewriting…',
|
||
rewriteFailed: 'No se pudo reescribir — inténtalo otra vez · Couldn’t rewrite',
|
||
cancel: 'Cancelar · Cancel',
|
||
retry: 'Reintentar · Retry',
|
||
useThis: 'Usar esta · Use this',
|
||
word: 'Palabra · Word',
|
||
inGarden: 'Ya está en el jardín · In your garden (tap to remove)',
|
||
saveToGarden: 'Guardar en el jardín · Save to garden',
|
||
readAloud: 'Leer en voz alta · Read aloud',
|
||
readSlowly: 'Leer despacio · Read slowly',
|
||
readAloudNative: 'Leer en español · Read in Spanish',
|
||
lookingUp: 'Buscando… · Looking up…',
|
||
definition: 'Definición · Definition',
|
||
synonyms: 'Sinónimos · Synonyms',
|
||
tapToSwap: 'toca para cambiar · tap to swap',
|
||
nothingFound: 'No encontré esta palabra · Nothing found for this word',
|
||
origin: 'Origen · Origin',
|
||
// El par español ve esto seguido: inglés y español comparten tanto latín que
|
||
// los choques son la regla y no la excepción — real, red, once, pie, sin,
|
||
// pan, mayor, sale, ropa.
|
||
alsoIn: 'También es una palabra en español · Also a word in Spanish',
|
||
wordBands: {
|
||
simple: { native: 'De todos los días', en: 'Everyday word' },
|
||
standard: { native: 'Común', en: 'Standard' },
|
||
advanced: { native: 'Avanzada', en: 'Advanced' },
|
||
},
|
||
},
|
||
|
||
styles: {
|
||
natural: { native: 'Más natural', en: 'Natural' },
|
||
academic: { native: 'Académico', en: 'Academic' },
|
||
professional: { native: 'Profesional', en: 'Professional' },
|
||
casual: { native: 'Informal', en: 'Casual' },
|
||
humorous: { native: 'Divertido', en: 'Humorous' },
|
||
creative: { native: 'Creativo', en: 'Creative' },
|
||
persuasive: { native: 'Persuasivo', en: 'Persuasive' },
|
||
},
|
||
|
||
tones: {
|
||
general: { native: 'General', en: 'General' },
|
||
academic: { native: 'Académico', en: 'Academic' },
|
||
professional: { native: 'Profesional', en: 'Professional' },
|
||
casual: { native: 'Informal', en: 'Casual' },
|
||
humorous: { native: 'Divertido', en: 'Humorous' },
|
||
creative: { native: 'Creativo', en: 'Creative' },
|
||
persuasive: { native: 'Persuasivo', en: 'Persuasive' },
|
||
},
|
||
|
||
exports: {
|
||
label: 'Exportar',
|
||
print: 'Imprimir / PDF',
|
||
formats: {
|
||
md: { native: 'Markdown', en: 'Markdown (.md)' },
|
||
docx: { native: 'Documento de Word', en: 'Word (.docx)' },
|
||
html: { native: 'Página web', en: 'Web page (.html)' },
|
||
txt: { native: 'Texto sin formato', en: 'Plain text (.txt)' },
|
||
},
|
||
},
|
||
|
||
garden: {
|
||
title: 'Jardín de palabras · Vocabulary Garden',
|
||
titleWithFlower: '🌷 Jardín de palabras · Vocabulary Garden',
|
||
reviewing: 'Repaso · Reviewing — recall, then grade yourself',
|
||
subtitle: 'Words you looked up, blooming as you learn them',
|
||
reviewDue: (n) => `Repasar ${n} palabra${n === 1 ? '' : 's'} · Review ${n} due 🌸`,
|
||
emptyLead: 'Tu jardín todavía está vacío.',
|
||
emptyHint: 'Haz clic derecho en una palabra en inglés para buscarla — y aquí brotará.',
|
||
due: 'por repasar · due',
|
||
seen: (reps, intervalDays) => `repasada ${reps}× · seen ${reps}× · intervalo ${intervalDays} d`,
|
||
readAloud: '🔊 Leer',
|
||
readSlowly: '🐢 Despacio',
|
||
source: '📄 Fuente',
|
||
remove: '🗑 Quitar',
|
||
growing: (n) => `🐱💤 ${n} flor${n === 1 ? '' : 'es'} en el jardín · ${n} blossom${n > 1 ? 's' : ''} growing`,
|
||
end: 'Terminar · End',
|
||
promptProduction: '¿Cuál es la palabra en inglés? · Which English word?',
|
||
promptRecognition: '¿Qué significa? · What does this mean?',
|
||
showAnswer: 'Ver la respuesta · Show answer',
|
||
gradeAgain: { native: 'Repetir', en: 'Again' },
|
||
gradeGood: { native: 'La recuerdo', en: 'Good' },
|
||
gradeEasy: { native: 'Fácil', en: 'Easy' },
|
||
},
|
||
|
||
journal: {
|
||
tabGarden: '🌷 Jardín · Garden',
|
||
tabJournal: '🌱 Avances · Growth',
|
||
subtitle: 'Your own writing, month by month — only ever you and your past self',
|
||
empty: 'Sigue escribiendo un poco más — esta página crece a partir de tu propio trabajo. · Keep writing; this page grows out of your own work.',
|
||
keptHead: 'Este mes · This month',
|
||
kept: (n) => `${n} cosa${n === 1 ? '' : 's'} que te llevaste · ${n} thing${n === 1 ? '' : 's'} you took on board`,
|
||
keptBefore: (n) => `${n} el mes pasado · ${n} the month before`,
|
||
stuckHead: 'Se te quedó · Stayed with you',
|
||
stuck: (phrase, docs) =>
|
||
`“${phrase}” — ya la escribes sola, en ${docs} de tus textos · now in ${docs} of your pieces`,
|
||
fadedHead: 'Ya no necesitas corregir esto · You stopped needing this',
|
||
faded: (pattern, times) =>
|
||
`“${pattern}” — ${times}× antes, ninguna este mes · ${times}× back then, none this month`,
|
||
cheerStuck: (phrase) => ({
|
||
native: `¡Ya usas “${phrase}” tú solita! 🌱`,
|
||
en: `You’re using “${phrase}” on your own now! 🌱`,
|
||
}),
|
||
cheerFaded: (pattern) => ({
|
||
native: `Hace rato que “${pattern}” no necesita corrección 😌`,
|
||
en: `“${pattern}” hasn’t needed fixing in a while 😌`,
|
||
}),
|
||
},
|
||
|
||
history: {
|
||
title: 'Historial · History',
|
||
kinds: {
|
||
manual: { native: 'Punto guardado', en: 'Saved point' },
|
||
auto: { native: 'Automático', en: 'Auto' },
|
||
pre_restore: { native: 'Antes de restaurar', en: 'Before restore' },
|
||
},
|
||
justNow: 'ahora mismo · just now',
|
||
minutesAgo: (n) => `hace ${n} min · ${n} min ago`,
|
||
hoursAgo: (n) => `hace ${n} h · ${n} hr ago`,
|
||
daysAgo: (n) => `hace ${n} día${n > 1 ? 's' : ''} · ${n} day${n > 1 ? 's' : ''} ago`,
|
||
preview: 'Vista previa · Preview',
|
||
restoring: 'Restaurando… · Restoring…',
|
||
restoreThis: 'Restaurar esta versión · Restore this version',
|
||
passport: '📜 Pasaporte de escritura · Writing passport',
|
||
keepFullHistory: 'Guardar todo el historial · Keep full history',
|
||
},
|
||
|
||
status: {
|
||
savedLocally: 'Guardado en este dispositivo · Kept on this device',
|
||
helperRestingNative: 'El ayudante está descansando',
|
||
helperRestingEn: "· Petal's helper is resting · tu texto está guardado",
|
||
petalsToPolish: (n) => ({
|
||
native: `${n} ${n === 1 ? 'pétalo' : 'pétalos'} por pulir`,
|
||
en: `${n} ${n === 1 ? 'petal' : 'petals'} to polish`,
|
||
}),
|
||
soundsOn: 'Sonidos activados · Sounds on',
|
||
soundsOff: 'Sonidos desactivados · Sounds off',
|
||
petalsOn: 'Pétalos activados · Petals on',
|
||
petalsOff: 'Pétalos desactivados · Petals off',
|
||
statsTitle: 'Estadísticas · Writing stats',
|
||
stats: {
|
||
words: { native: 'Palabras', en: 'Words' },
|
||
characters: { native: 'Caracteres', en: 'Characters' },
|
||
sentences: { native: 'Oraciones', en: 'Sentences' },
|
||
paragraphs: { native: 'Párrafos', en: 'Paragraphs' },
|
||
pages: { native: 'Páginas', en: 'Pages' },
|
||
readingTime: { native: 'Tiempo de lectura', en: 'Reading time' },
|
||
avgWordLength: { native: 'Longitud promedio', en: 'Avg word length' },
|
||
variety: { native: 'Variedad de vocabulario', en: 'Word variety' },
|
||
readability: { native: 'Nivel de lectura', en: 'Reading level' },
|
||
},
|
||
readability: {
|
||
easy: { native: 'Fácil', en: 'Easy' },
|
||
standard: { native: 'Común', en: 'Standard' },
|
||
fairlyHard: { native: 'Algo difícil', en: 'Fairly hard' },
|
||
advanced: { native: 'Avanzado', en: 'Advanced' },
|
||
},
|
||
},
|
||
|
||
toolbar: {
|
||
untitledHeading: '(sin título)',
|
||
outline: 'Esquema · Outline',
|
||
outlineHint: 'Usa H1/H2/H3 para crear títulos, y el esquema aparecerá aquí.',
|
||
},
|
||
|
||
update: {
|
||
available: 'Hay una versión nueva disponible',
|
||
refresh: 'Actualizar · Refresh',
|
||
dismiss: 'Más tarde · Dismiss',
|
||
},
|
||
}
|