Files
petal/web/src/i18n/packs/pt-PT.ts
T
prosolis 3cc23b8ea4 The advice arrived in the language she was trying to read her way out of
Reported as "the Portuguese option isn't translating the advice in
English — it's just reprinting Portuguese." Nothing was wrong with
targetFor. It was reading a direction the account could not leave.

learnerPairs held only zh, so SetPair refused learning_pair for pt-PT
and every Portuguese account was learning_en by force. targetFor then
did exactly what it says: explanations follow the half of the pair she
is not learning, which for a forced learning_en account is Portuguese.
A Portuguese document, corrected in Portuguese, explained in
Portuguese, with no way to ask for English — correct behaviour derived
from a fact about the roster that was no longer true.

The note in learnerPairs was written one phase too early to see it. It
said turning a pair around needs a word list and a dictionary reading
into English, and that fr, es and pt-PT had neither. Portuguese has
both. Word boundaries are spaces — the megabyte jieba needs is a
property of a writing system that doesn't use them, not a debt every
pair owes. And the dictionary arrived with dict.db, which reads pt→en
as readily as en→pt; dreamProvider.reverse has been answering that
question since the pair shipped. What was actually blocking the pair a
native English speaker learning Portuguese needs was this list.

So pt-PT joins it, and the pt-PT pack gets the learner copy the control
renders from — each label in the language of whoever would pick it,
since someone on the wrong side of that switch cannot read the side
they are reaching for. fr and es clear the same two bars through the
same dict.db and stay out: their packs carry no learner block yet,
which is a translation question rather than a data one, and the server
should keep saying no until one is written.

Two things that assumed learning_pair meant Chinese, now that it
doesn't. The segmenter gate reads the pair as well as the direction, or
a Portuguese learner would load a megabyte of Chinese word list and
hover Portuguese words at /api/hanzi. And that endpoint's own comment
justified skipping providerFor with a guarantee it no longer has; the
real guarantee was always the caller's — it is only ever asked about
tokens the Chinese segmenter found — and a stray lookup was already
safe, answering a miss with an empty 200.

Tests in both packages. The auth test that pinned pt-PT's refusal now
pins its acceptance, with fr and es still refused; the suggestions test
pins the consequence where it actually lands, which is the language she
reads her advice in.

Claude-Session: https://claude.ai/code/session_01GJHNvirh7Hzhc9RL3HAvz7
2026-07-29 18:40:22 -07:00

493 lines
27 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// The European Portuguese pack — the first pair that is not Chinese, and the
// one that proves a language really is data.
//
// ⚠️ REVIEWED BY FOUR MODELS, NOT BY A pt-PT SPEAKER.
// SUGGESTIONS.md §3 sets the bar: "the pt-PT pack should be reviewed by a pt-PT
// speaker before it's trusted — same standard the zh copy got by being written
// for a real reader." That has still not happened. What has happened
// (2026-07-27) is an interim pass: four different models read this file
// independently as European Portuguese speakers, and only findings at least two
// of them reached on their own were applied — see BUILD_PLAN Phase 24.
//
// It found something worth the whole exercise: this file was carrying
// **pre-Acordo spellings** — *adjectivos*, *actualmente* — in direct
// contradiction of the paragraph directly below, and *decepção*, which is the
// Brazilian form. The test greps guarded against Brazilian vocabulary and never
// against the pack's own stated spelling policy; they do now. Treat this as a
// better-checked draft, and still expect a speaker to change the register long
// before they change the vocabulary.
//
// European Portuguese, not Brazilian. That is the single most likely way for
// this file to go quietly wrong, so the choices are deliberate throughout:
//
// * Post-Acordo spellings (ação, direção, ótimo), but the pt-PT lexicon —
// ficheiro not arquivo, ecrã not tela, guardar not salvar, eliminar not
// deletar, telemóvel not celular, sinónimo not sinônimo, académico not
// acadêmico.
// * "Estás a escrever", not "está escrevendo". The progressive with *a* +
// infinitive is the European construction, and the gerund is the single
// clearest tell of a Brazilian text.
// * Second person singular *tu*, because Petal is a companion in someone's
// private notebook and *você* would put a desk between them.
// * "Iniciar sessão" / "Terminar sessão", not "fazer login" / "sair".
//
// Portuguese first, English underneath — same shape as the zh pack, 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 ptPT: Pack = {
code: 'pt-PT',
nativeName: 'Português',
locale: 'pt-PT',
// pt-PT is the second pair Petal can be *learned* toward: spaces do the
// segmenting a Latin script needs, and dict.db already reads Portuguese into
// English (see auth.learnerPairs for both halves of that argument).
//
// Each label is written for whoever would pick it, which is why they are not
// in the same language as each other. A native Portuguese speaker practising
// English reads the first; an English speaker learning Portuguese reads the
// second, and would not be helped by being told "Português" in Portuguese.
//
// This is also the switch that decides which language Petal *explains* in, so
// it is the difference between a Portuguese document annotated in Portuguese
// and the same document annotated in English.
learner: {
label: 'Estou a aprender · I am learning',
toEn: 'inglês',
toPair: 'Portuguese',
failed: 'Não foi possível mudar · Couldnt switch — nothing changed',
},
app: {
duplicateTitle: (title) => `${title} (cópia)`,
garden: 'Jardim de palavras',
history: 'Histórico',
},
auth: {
title: 'Inicia sessão outra vez',
titleEn: 'Please sign in again',
bodyWithDraft:
'O que acabaste de escrever está guardado neste dispositivo — volta a entrar e guarda-se sozinho.',
bodyWithDraftEn: "What you just wrote is safe on this device — it'll save itself once you're back in.",
bodyPlain: 'A tua sessão expirou. Tudo o que escreveste já está guardado.',
bodyPlainEn: 'Your session expired. Everything you wrote is already saved.',
signIn: 'Iniciar sessão · Sign in',
},
companion: {
choose: 'Escolhe um companheiro · Choose a companion',
encouragements: [
{ native: 'Que bom! Esta frase ficou bem mais fluida 🌸', en: 'Lovely — that reads so much smoother now.' },
{ native: 'Estás a escrever cada vez melhor ✨', en: "You're getting better and better." },
{ native: 'Gosto muito desta mudança 💕', en: 'I really like that change.' },
{ native: 'Continua assim — tu consegues!', en: 'Keep going — youve got this!' },
{ native: 'Pois é, assim ficou muito mais claro 👍', en: 'Mm, thats much clearer.' },
{ native: 'Que boa escolha de palavra 🌷', en: 'Thats such a good word choice.' },
{ native: 'Ui, este parágrafo lê-se tão bem ☁️', en: 'Ooh, that paragraph flows so nicely.' },
{ native: 'Adoro ver-te escrever com mais confiança 💛', en: 'I love watching you write with more confidence.' },
{ native: 'Cada bocadinho de progresso conta 🌱', en: 'Every little bit of progress counts.' },
{ native: 'Hoje as tuas palavras estão a brilhar ✨', en: 'Your words are sparkling today.' },
],
tips: [
{ native: 'Dica: em inglês, frases mais curtas leem-se melhor.', en: 'Tip: shorter English sentences often read clearer.' },
{ native: 'Não te esqueças dos artigos “the” e “a”.', en: "Don't forget articles like “the” and “a”." },
{ native: 'Para o passado, usa o past tense: go → went.', en: 'For the past, use past tense: go → went.' },
{ native: 'Ler em voz alta ajuda a apanhar o que soa estranho.', en: 'Reading aloud helps you catch awkward spots.' },
{ native: 'Uma ideia por parágrafo e fica tudo arrumado.', en: 'One idea per paragraph keeps it tidy.' },
{ native: 'Se tiveres dúvidas, pergunta-me ✨', en: 'Not sure about something? Just ask me. ✨' },
{ native: 'O plural leva “s”: two apples 🍎', en: 'Plurals take an “s”: two apples 🍎' },
// One tip the zh pack has no use for: the false friends between
// Portuguese and English are a daily hazard for this writer and a
// non-problem for the last one.
{ native: 'Atenção aos falsos amigos: “pretender” não é *to pretend*.', en: 'Careful with false friends — “pretender” means to intend.' },
],
breaks: [
{ native: 'Já escreves há um bom bocado — levanta-te e descansa os olhos 🍵', en: "You've been writing a while — stretch and rest your eyes. 🍵" },
{ native: 'Bebe um copo de água e para cinco minutos?', en: 'Sip some water and take five?' },
{ native: 'Olha ao longe um momento, dá uma folga aos olhos 🌿', 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 Portuguese line leads gently into it, exactly
// as the Mandarin one does.
bedtime: [
{ native: 'A tua cama deve estar com saudades 🛏️', en: 'I bet your bed is missing you right now.' },
{ native: 'Cansada não se escreve bem — vai descansar 🌙', en: 'A tired writer is a bad writer — get some rest.' },
{ native: 'Dorme sobre o assunto, que as ideias vêm sozinhas ✨', en: 'Sleep is a wondrous enabler.' },
{ native: 'Ouves? Pois não ouves… está toda a gente a dormir, e tu também devias 😴', en: "Hear that? No… you don't, because everyone is sleeping and you should be too." },
// Portuguese proverbs on sleep and haste, in place of the Chinese ones —
// a pack is not a translation of another pack.
{ native: 'Deitar cedo e cedo erguer dá saúde e faz crescer.', en: 'Early to bed and early to rise makes you healthy and helps you grow.' },
{ native: 'Quem dorme sobre o problema, acorda com a solução.', en: 'Sleep on the problem and you wake with the answer.' },
{ native: 'Depressa e bem, há pouco quem.', en: 'Fast and good together — few manage that.' },
],
greeting: { native: 'Olá! Estou aqui a fazer-te companhia 🐱', en: "Hi! I'm right here keeping you company. 🐱" },
welcomeBack: { native: 'Bem-vinda de volta ✨ vamos continuar!', en: 'Welcome back ✨ lets keep going!' },
errors: [
{ native: 'Ups — houve um percalço, mas as tuas palavras estão a salvo.', en: 'Oops — a little hiccup, but your words are safe.' },
{ native: 'Bolas, encravei por um segundo — já volto.', en: 'Haiya, I got stuck for a sec — back in a moment.' },
{ native: 'Não te preocupes, tentamos outra vez daqui a pouco 🍵', en: "Don't worry — let's try again in a bit. 🍵" },
],
milestone: (words: number) => ({
native: `Uau! Já vais em ${words} palavras 🎉`,
en: `Wow — ${words} words already! Amazing. 🎉`,
}),
// Uma coisa pequena para escrever, oferecida uma vez por dia a uma página
// em branco. Memórias e opiniões, nunca exercícios: não há aqui nada que se
// possa errar, que é precisamente a intenção.
invitations: [
{ native: 'Escreve 50 palavras: uma coisa pequena que te fez sorrir hoje 🌸', en: 'Write 50 words: one small thing that made you smile today.' },
{ native: 'Escreve 50 palavras: a melhor coisa que comeste hoje', en: 'Write 50 words: the best thing you ate today.' },
{ native: 'Escreve 50 palavras: o que vês da tua janela neste momento', en: 'Write 50 words: what you can see out of your window right now.' },
{ native: 'Escreve 50 palavras: um sítio onde voltarias de bom grado', en: 'Write 50 words: somewhere you would happily go back to.' },
{ native: 'Escreve 50 palavras: uma coisa que aprendeste esta semana', en: 'Write 50 words: one thing you learned this week.' },
{ native: 'Escreve 50 palavras: algo para dizeres a ti própria daqui a um ano', en: 'Write 50 words: something to tell yourself a year from now.' },
{ native: 'Escreve 50 palavras: uma música que tens ouvido ultimamente', en: 'Write 50 words: a song you have had on lately.' },
{ native: 'Escreve 50 palavras: alguém a quem gostavas de agradecer hoje', en: 'Write 50 words: someone you would like to thank today.' },
],
inviteAccept: 'Vamos lá · Lets write',
inviteDecline: 'Hoje não · Not today',
declined: { native: 'Está bem, volto a dormir 😴', en: 'Fair enough — back to my nap. 😴' },
names: {
cat: 'Gato dorminhoco',
dog: 'Cão contente',
'wiggle-dog': 'Cão abana-rabo',
butterfly: 'Borboleta',
parrot: 'Papagaio',
},
},
prose: {
longSentence: 'Esta frase está um bocadinho longa — dividi-la em duas ou três fica mais claro 🌸',
commaSplice: 'Aqui há duas frases ligadas só por uma vírgula. Podes usar um ponto final, ou juntar “and / but”.',
vagueThis: (word) => `Não se percebe bem a que “${word}” se refere — vale a pena dizê-lo (por exemplo, “${word} idea / change…”).`,
oxfordComma: 'Numa lista de três ou mais, uma vírgula antes de “and / or” também ajuda a ler (a vírgula de Oxford).',
transitionComma: (word) => `Depois de uma palavra de ligação no início, põe uma vírgula: “${word}, …”.`,
capitalizeSentence: 'Começa cada frase com letra maiúscula.',
repeatedWord: (word) => `“${word}” parece estar escrito duas vezes — dá uma vista de olhos.`,
capitalizeI: 'Em inglês, o “I” (eu) escreve-se sempre com maiúscula.',
spaceBeforePunct: 'Em inglês não se põe espaço antes da pontuação: a vírgula e o ponto vêm colados à palavra.',
spaceAfterPunct: 'Depois da vírgula ou do ponto, deixa um espaço antes da palavra seguinte.',
articleAn: (word) => `Antes de som de vogal usa-se “an”: “an ${word}”.`,
articleA: (word) => `Antes de som de consoante usa-se “a”: “a ${word}”.`,
uncountable: (word, singular) => `“${word}” é incontável em inglês — não leva s, basta “${singular}”.`,
capitalizeProper: (fixed) => `Em inglês, línguas, nacionalidades, dias da semana e meses levam maiúscula: “${fixed}”.`,
thirdPersonS: (subject, verb) => `Com he/she/it, o verbo leva -s: “${subject} ${verb}”.`,
pluralAfter: (determiner, noun) => `Depois de “${determiner}” o nome vai no plural: “${determiner} ${noun}s”.`,
doubleDeterminer: (first, second) => `“${first} ${second}” tem dois determinantes — fica só com um (por exemplo, tira “${first}”).`,
thereArePlural: (noun) => `Com plural usa-se “there are”: “there are ${noun}…”.`,
itsOwn: '“its” = “it is”. Para dizer “o seu / dele”, é “its” — portanto “its own”.',
itsIs: (rest) => `Aqui é “its ${rest}” (it is); “its” é o possessivo.`,
thanNotThen: (word) => `Nas comparações usa-se “than”, não “then”: “${word} than”.`,
preposition: (wrong, right) => `Em inglês diz-se “${right}”, não “${wrong}” — esta preposição é fixa.`,
collocation: (wrong, right) => `Em inglês estas palavras andam juntas assim: “${right}”, e não “${wrong}”.`,
doubleComparative: (lead, word) => `“${word}” já é o comparativo — não precisa do “${lead}”: basta “${word}”.`,
peopleArePlural: (verb) => `“People” é plural em inglês: “people ${verb}”.`,
ageIsNotHave: (years) => `Em inglês a idade é com o verbo *to be*, não com *have*: “I am ${years} years old”.`,
agreeIsAVerb: '“Agree” já é o verbo — não leva *to be* à frente: diz-se “I agree”.',
forNotSince: (duration) => `Para uma duração usa-se “for”: “for ${duration}”. O “since” marca o início (since 2020).`,
veryBeforeVerb: (verb) => `“Very” só acompanha adjetivos, não verbos: “really ${verb}”, ou “${verb} … very much”.`,
turnOnNotOpen: (thing, on) => `Em inglês os aparelhos não se abrem nem se fecham — ligam-se e desligam-se: “turn ${on ? 'on' : 'off'} the ${thing}”.`,
althoughOrBut: (word) => `Em inglês usa-se “${word}” ou “but”, nunca os dois na mesma frase.`,
},
// Os falsos amigos entre o português e o inglês — a armadilha que faz uma
// pessoa sentir-se tola em vez de apenas corrigida. Por isso são só um aviso:
// o Petal nunca troca a palavra, porque “actually” pode muito bem ser mesmo a
// que ela queria.
falseFriends: {
actually: {
native: '“Actually” quer dizer *na verdade*, não *atualmente*. Para “atualmente” diz-se “currently” / “nowadays”.',
en: '“Actually” means *in fact*. For the Portuguese *atualmente*, English uses “currently”.',
},
eventually: {
native: '“Eventually” quer dizer *por fim, mais cedo ou mais tarde* — não *eventualmente*. Para isso: “possibly” ou “if necessary”.',
en: '“Eventually” means *in the end*, not *possibly*.',
},
pretend: {
native: '“Pretend” é *fingir*. Para *pretender* diz-se “intend” ou “plan to”.',
en: '“Pretend” means to fake something; the Portuguese *pretender* is “intend”.',
},
realize: {
native: '“Realize” é *aperceber-se*. Para *realizar* (fazer, levar a cabo) diz-se “carry out” ou “achieve”.',
en: '“Realize” means to become aware; *realizar* is “carry out”.',
},
assist: {
native: '“Assist” é *ajudar*. Para *assistir a* (ver) diz-se “attend” ou “watch”.',
en: '“Assist” means to help; *assistir a* is “attend” or “watch”.',
},
library: {
native: '“Library” é a *biblioteca*. A *livraria* é “bookshop” / “bookstore”.',
en: '“Library” is where books are lent; a shop that sells them is a “bookshop”.',
},
parents: {
native: '“Parents” são só o pai e a mãe. Os *parentes* são “relatives”.',
en: '“Parents” means mother and father only; *parentes* are “relatives”.',
},
sensible: {
native: '“Sensible” é *sensato*. Para *sensível* diz-se “sensitive”.',
en: '“Sensible” means level-headed; *sensível* is “sensitive”.',
},
push: {
native: '“Push” é *empurrar* — o contrário de *puxar* (“pull”).',
en: '“Push” is the opposite of *puxar*, which is “pull”.',
},
college: {
native: '“College” é o ensino superior. O *colégio* (escola) é “school”.',
en: '“College” is higher education; a *colégio* is a “school”.',
},
exit: {
native: '“Exit” é a *saída*. O *êxito* é “success”.',
en: '“Exit” is the way out; *êxito* is “success”.',
},
fabric: {
native: '“Fabric” é o *tecido*. A *fábrica* é “factory”.',
en: '“Fabric” is cloth; a *fábrica* is a “factory”.',
},
lecture: {
native: '“Lecture” é uma *aula / palestra*. A *leitura* é “reading”.',
en: '“Lecture” is a talk; *leitura* is “reading”.',
},
notice: {
native: '“Notice” é *reparar* ou um *aviso*. A *notícia* é “news”.',
en: '“Notice” is to spot something; *notícia* is “news”.',
},
support: {
native: '“Support” é *apoiar*. Para *suportar* (aguentar) diz-se “put up with” ou “bear”.',
en: '“Support” means to back someone up; *suportar* is to “bear”.',
},
costume: {
native: '“Costume” é um *disfarce / traje*. Os *costumes* são “customs” ou “habits”.',
en: '“Costume” is fancy dress; *costumes* are “customs”.',
},
deception: {
native: '“Deception” é *engano*. A *deceção* é “disappointment”.',
en: '“Deception” means being misled; *deceção* is “disappointment”.',
},
injury: {
native: '“Injury” é uma *lesão*. A *injúria* é “insult”.',
en: '“Injury” is physical harm; *injúria* is an “insult”.',
},
balcony: {
native: '“Balcony” é a *varanda*. O *balcão* é “counter”.',
en: '“Balcony” is a terrace; a *balcão* is a “counter”.',
},
},
docs: {
sortRecent: 'Recentes · Recent',
sortTitle: 'Título · Title',
sortLongest: 'Mais longos · Longest',
backUpAll: 'Cópia de segurança · Back up all:',
signOut: 'Terminar sessão · Sign out',
duplicate: 'Duplicar · Duplicate',
searchPlaceholder: 'Procurar · Search',
searching: 'A procurar… · Searching…',
noMatches: 'Sem resultados · No matches',
tags: 'Etiquetas · Tags',
newTagPlaceholder: 'Nova etiqueta · New tag',
language: 'Idioma · Language',
languageFailed: 'Não deu para mudar — continua na mesma língua · Couldnt switch',
},
editor: {
askPlaceholder: 'Ask why… / Pergunta porquê…',
chatFailed: 'Não consegui responder agora — pergunta-me outra vez, se faz favor. 🌸\n\nI had trouble answering just now — please ask me again. 🌸',
findPlaceholder: 'Localizar · Find',
findNone: 'Nada · 0',
matchCase: 'Match case · Maiúsculas/minúsculas',
close: 'Close · Fechar',
replacePlaceholder: 'Substituir por · Replace',
replace: 'Substituir',
replaceAll: 'Tudo',
translateLabel: 'Tradução · Translate',
triageHint: {
native: 'Tab seguinte · Enter aceitar · Del ignorar · ? perguntar à Petal · Esc sair',
en: 'Tab next · Enter accept · Del dismiss · ? Ask Petal · Esc exit',
},
spelling: 'Ortografia · Spelling',
noSuggestions: 'Sem sugestões · No suggestions',
addToDictionary: 'Adicionar ao dicionário · Add to dictionary',
readSelection: 'Ler a seleção em voz alta · Read selection aloud',
rewrite: 'Reescrever · Rewrite',
rewriting: 'A reescrever… · Rewriting…',
rewriteFailed: 'Não deu para reescrever — tenta outra vez · Couldnt rewrite',
cancel: 'Cancelar · Cancel',
retry: 'Tentar de novo · Retry',
useThis: 'Usar esta · Use this',
word: 'Palavra · Word',
inGarden: 'Já está no jardim · In your garden (tap to remove)',
saveToGarden: 'Guardar no jardim · Save to garden',
readAloud: 'Ler em voz alta · Read aloud',
readSlowly: 'Ler devagar · Read slowly',
readAloudNative: 'Ler em português · Read in Portuguese',
lookingUp: 'A procurar… · Looking up…',
definition: 'Definição · Definition',
synonyms: 'Sinónimos · Synonyms',
tapToSwap: 'toca para trocar · tap to swap',
nothingFound: 'Não encontrei esta palavra · Nothing found for this word',
origin: 'Origem · Origin',
// This one the pt-PT pair actually sees: sale, comum, tarde, ali, data and
// dozens more are words on both sides of the pair.
alsoIn: 'Também é palavra em português · Also a word in Portuguese',
wordBands: {
simple: { native: 'Do dia a dia', en: 'Everyday word' },
standard: { native: 'Normal', en: 'Standard' },
advanced: { native: 'Avançada', en: 'Advanced' },
},
},
styles: {
natural: { native: 'Mais natural', en: 'Natural' },
academic: { native: 'Académico', en: 'Academic' },
professional: { native: 'Profissional', en: 'Professional' },
casual: { native: 'Descontraído', en: 'Casual' },
humorous: { native: 'Bem-humorado', en: 'Humorous' },
creative: { native: 'Criativo', en: 'Creative' },
persuasive: { native: 'Persuasivo', en: 'Persuasive' },
},
tones: {
general: { native: 'Geral', en: 'General' },
academic: { native: 'Académico', en: 'Academic' },
professional: { native: 'Profissional', en: 'Professional' },
casual: { native: 'Descontraído', en: 'Casual' },
humorous: { native: 'Bem-humorado', en: 'Humorous' },
creative: { native: 'Criativo', en: 'Creative' },
persuasive: { native: 'Persuasivo', en: 'Persuasive' },
},
exports: {
label: 'Exportar',
print: 'Imprimir / PDF',
formats: {
md: { native: 'Markdown', en: 'Markdown (.md)' },
docx: { native: 'Documento Word', en: 'Word (.docx)' },
html: { native: 'Página web', en: 'Web page (.html)' },
txt: { native: 'Texto simples', en: 'Plain text (.txt)' },
},
},
garden: {
title: 'Jardim de palavras · Vocabulary Garden',
titleWithFlower: '🌷 Jardim de palavras · Vocabulary Garden',
reviewing: 'A rever · Reviewing — recall, then grade yourself',
subtitle: 'Words you looked up, blooming as you learn them',
reviewDue: (n) => `Rever ${n} palavra${n === 1 ? '' : 's'} · Review ${n} due 🌸`,
emptyLead: 'O teu jardim ainda está vazio.',
emptyHint: 'Clica com o botão direito numa palavra inglesa para a procurar — e ela germina aqui.',
due: 'a rever · due',
seen: (reps, intervalDays) => `${reps}× revista · seen ${reps}× · intervalo ${intervalDays}d`,
readAloud: '🔊 Ler',
readSlowly: '🐢 Devagar',
source: '📄 Origem · Source',
remove: '🗑 Remover',
growing: (n) => `🐱💤 ${n} flor${n === 1 ? '' : 'es'} no jardim · ${n} blossom${n > 1 ? 's' : ''} growing`,
end: 'Terminar · End',
promptProduction: 'Qual é a palavra inglesa? · Which English word?',
promptRecognition: 'O que significa? · What does this mean?',
showAnswer: 'Ver a resposta · Show answer',
gradeAgain: { native: 'Outra vez', en: 'Again' },
gradeGood: { native: 'Lembro-me', en: 'Good' },
gradeEasy: { native: 'Fácil', en: 'Easy' },
},
journal: {
tabGarden: '🌷 Jardim · Garden',
tabJournal: '🌱 Progresso · Growth',
subtitle: 'Your own writing, month by month — only ever you and your past self',
empty: 'Escreve mais um pouco — esta página nasce do teu próprio trabalho. · Keep writing; this page grows out of your own work.',
keptHead: 'Este mês · This month',
kept: (n) => `${n} coisa${n === 1 ? '' : 's'} que aproveitaste · ${n} thing${n === 1 ? '' : 's'} you took on board`,
keptBefore: (n) => `${n} no mês anterior · ${n} the month before`,
stuckHead: 'Ficou contigo · Stayed with you',
stuck: (phrase, docs) =>
${phrase}» — já a usas sozinha, em ${docs} textos teus · now in ${docs} of your pieces`,
fadedHead: 'Já não precisas de corrigir · You stopped needing this',
faded: (pattern, times) =>
${pattern}» — ${times}× nessa altura, nenhuma este mês · ${times}× back then, none this month`,
cheerStuck: (phrase) => ({
native: `Já escreves «${phrase}» sozinha! 🌱`,
en: `Youre using “${phrase}” on your own now! 🌱`,
}),
cheerFaded: (pattern) => ({
native: `Há já algum tempo que «${pattern}» não precisa de correção 😌`,
en: `“${pattern}” hasnt needed fixing in a while 😌`,
}),
},
history: {
title: 'Histórico · History',
kinds: {
manual: { native: 'Ponto guardado', en: 'Saved point' },
auto: { native: 'Automático', en: 'Auto' },
pre_restore: { native: 'Antes de restaurar', en: 'Before restore' },
},
justNow: 'just now · agora mesmo',
minutesAgo: (n) => `${n} min ago · há ${n} min`,
hoursAgo: (n) => `${n} hr ago · há ${n} h`,
daysAgo: (n) => `${n} day${n > 1 ? 's' : ''} ago · há ${n} dia${n > 1 ? 's' : ''}`,
preview: 'Pré-visualizar · Preview',
restoring: 'Restoring…',
restoreThis: 'Restaurar esta versão · Restore this version',
passport: '📜 Certificado de escrita · Writing passport',
keepFullHistory: 'Guardar o histórico completo · Keep full history',
},
status: {
savedLocally: 'Guardado neste dispositivo · Kept on this device',
helperRestingNative: 'O ajudante está a descansar',
helperRestingEn: "· Petal's helper is resting · o teu texto está guardado",
petalsToPolish: (n) => ({
native: `${n} ${n === 1 ? 'pétala' : 'pétalas'} para polir`,
en: `${n} ${n === 1 ? 'petal' : 'petals'} to polish`,
}),
soundsOn: 'Som ligado · Sounds on',
soundsOff: 'Som desligado · Sounds off',
petalsOn: 'Pétalas ligadas · Petals on',
petalsOff: 'Pétalas desligadas · Petals off',
statsTitle: 'Estatísticas · Writing stats',
stats: {
words: { native: 'Palavras', en: 'Words' },
characters: { native: 'Caracteres', en: 'Characters' },
sentences: { native: 'Frases', en: 'Sentences' },
paragraphs: { native: 'Parágrafos', en: 'Paragraphs' },
pages: { native: 'Páginas', en: 'Pages' },
readingTime: { native: 'Tempo de leitura', en: 'Reading time' },
avgWordLength: { native: 'Comprimento médio', en: 'Avg word length' },
variety: { native: 'Variedade vocabular', en: 'Word variety' },
readability: { native: 'Nível de leitura', en: 'Reading level' },
},
readability: {
easy: { native: 'Fácil', en: 'Easy' },
standard: { native: 'Normal', en: 'Standard' },
fairlyHard: { native: 'Algo difícil', en: 'Fairly hard' },
advanced: { native: 'Avançado', en: 'Advanced' },
},
},
toolbar: {
untitledHeading: '(sem título)',
outline: 'Estrutura · Outline',
outlineHint: 'Usa H1/H2/H3 para criar títulos e a navegação aparece aqui.',
},
update: {
available: 'Há uma versão nova',
refresh: 'Atualizar · Refresh',
dismiss: 'Mais tarde · Dismiss',
},
}