\p{L}+)" + NotWordAfter + @"(?!-)", Ci);
private static readonly Regex ReferenceSubordinateVerb = new(
- @"(?(?\p{L}+)(?![\p{L}\p{M}-])", Ci);
+ @"(?(?\p{L}+)(?![\p{L}\p{M}-])", Ci);
private static readonly Regex ImpersonalWhatVerb = new(
@"^(?:acontece|aconteceu|acontecia|acontecerá|aconteceria|aconteça|acontecesse)$", Ci);
@@ -2771,6 +2840,15 @@ public static string Apply(string s, string? previousText = null, ReferenceHint?
private static string ReplaceReferenceSubordinateVerb(Match m, ReferenceHint reference)
{
+ var prefix = m.Result("$`");
+ if (Regex.IsMatch(prefix, @"\b(?:quer|queres|queria|querias|querem|quiser)\s*$", Ci) &&
+ Regex.IsMatch(reference.EnglishText ?? "", @"\bwant(?:ed|s)?\s+me\s+to\b", Ci))
+ return m.Value;
+ if (Regex.IsMatch(m.Groups["pre"].Value, @"\b(?:não|nunca|já|ainda|sempre|também|só|apenas)\b", Ci) &&
+ !Regex.IsMatch(prefix, @"^[\s""“«'\uE000-\uF8FF-]*$|\b" +
+ @"(?:sei|sabes|sabe|sabemos|disse|dizes|diz|digo|dizer|acho|achas|acha|penso|pensas|pensa|" +
+ @"creio|acredito|certeza|claro|óbvio)\s*$", Ci))
+ return m.Value;
// In "quem achas que vê", "quem" is the embedded subject, not the addressee.
if (ConversionConstructions.KeepsExtractedQuestionSubject(m.Result("$`") + m.Groups["pre"].Value, reference))
return m.Value;
@@ -2780,7 +2858,7 @@ private static string ReplaceReferenceSubordinateVerb(Match m, ReferenceHint ref
var after = m.Result("$'");
var impersonal = ImpersonalWhatVerb.IsMatch(verb) ||
verb.Equals("está", StringComparison.OrdinalIgnoreCase) &&
- Regex.IsMatch(after, @"^\s+(?:a\s+acontecer|acontecendo)\b", Ci);
+ Regex.IsMatch(after, @"^\s+(?:a\s+(?:acontecer|haver)|acontecendo|havendo)\b", Ci);
var copular = CopularWhatVerb.IsMatch(verb) &&
(!reference.SecondPersonWhatSubject || Regex.IsMatch(after, @"^\s+(?:isso|isto|aquilo)\b", Ci));
if (impersonal || copular) return m.Value;
@@ -3087,7 +3165,7 @@ private static string ReplaceObject(Match m)
/// "você tem" → "tens": European Portuguese normally drops the subject pronoun, the verb ending
/// already says who it is ("Você não se lembra?" → "Não te lembras?").
///
- private static string ReplaceSubject(Match m)
+ private static string ReplaceSubject(Match m, bool conversationalObjectConditional)
{
var verb = m.Groups["v"].Value;
var explicitTu = m.Groups["you"].Value.Equals("tu", StringComparison.OrdinalIgnoreCase);
@@ -3128,7 +3206,18 @@ private static string ReplaceSubject(Match m)
? CaseHelper.MatchCase(clitic, "te")
: clitic;
var proclisis = m.Groups["sub"].Success || Regex.IsMatch(adv, @"(?:^|\s)(?:" + ProclisisTriggers + @")(?:$|\s)", Ci) || PortugueseVerbs.IsFutureOrConditional(verb);
- result = proclisis
+ var conditionalObject = conversationalObjectConditional && !m.Groups["sub"].Success &&
+ adv.Length == 0 && cl.ToLowerInvariant() is "o" or "a" or "os" or "as" &&
+ PortugueseVerbs.TrySplitFuture(second, out _, out var ending, true) &&
+ ending.Equals("ias", StringComparison.OrdinalIgnoreCase);
+ result = conditionalObject
+ ? "irias " + PortugueseVerbs.AttachEnclitic(
+ second[..^3].ToLowerInvariant() switch
+ {
+ "dir" => "dizer", "far" => "fazer", "trar" => "trazer",
+ var infinitive => infinitive,
+ }, cl)
+ : proclisis
? (adv.Length > 0 ? adv + " " : string.Empty) + cl + " " + second
: (adv.Length > 0 ? adv + " " : string.Empty) + PortugueseVerbs.AttachEnclitic(second, cl);
}
@@ -3521,7 +3610,22 @@ private static string ReplaceReflexiveCommand(Match m)
// "obriga-os a te verem" / "dopar-te e depois te afogar" → "a verem-te" / "depois afogar-te".
private static readonly Regex LinkedInfinitiveClitic = new(
- NotWordBefore + @"(?a|e\s+depois|depois|e|ou)\s+(?me|te|nos|lhe|lhes)\s+(?\p{Ll}+(?:ar|er|ir|arem|erem|irem|ares|eres|ires|armos|ermos|irmos))" + NotWordAfter + @"(?!-)", Ci);
+ NotWordBefore + @"(?a|e\s+depois|depois|e|ou|mas)\s+(?me|te|se|nos|vos|lhe|lhes)\s+" +
+ @"(?(?:[\p{L}\p{M}]+(?:ar|er|ir|or|ôr)|pôr)(?:em|es|mos)?)" + NotWordAfter + @"(?!-)", Ci);
+
+ private static string ReplaceLinkedInfinitive(Match m)
+ {
+ var verb = m.Groups["v"].Value;
+ var infinitive = Regex.Replace(verb.ToLowerInvariant(), @"(?:em|es|mos)$", "");
+ // At a coordinated clause start, "se" can be a conditional conjunction, not a clitic.
+ if (m.Groups["cl"].Value.Equals("se", StringComparison.OrdinalIgnoreCase) &&
+ m.Groups["l"].Value.ToLowerInvariant() is "e" or "ou" or "mas")
+ return m.Value;
+ if (!PortugueseVerbs.IsInfinitive(infinitive) ||
+ (!PortugueseVerbs.IsKnownInfinitive(infinitive) && !NaturaDictionary.Load(true).Check(infinitive)))
+ return m.Value;
+ return m.Groups["l"].Value + " " + PortugueseVerbs.AttachEnclitic(verb, m.Groups["cl"].Value);
+ }
// "Eu vi ele" / "Mata ela!" → "Eu vi-o" / "Mata-a!" ("não vi ele" → "não o vi")
private static readonly Regex ObjectPronoun = new(
@@ -3530,7 +3634,8 @@ private static string ReplaceReflexiveCommand(Match m)
private static readonly HashSet Modals = new(StringComparer.OrdinalIgnoreCase)
{
- "vou", "vais", "vai", "vamos", "vão", "ia", "ias", "íamos", "iam", "fui", "foi", "quero", "queres", "quer",
+ "vou", "vais", "vai", "vamos", "vão", "ia", "ias", "íamos", "iam", "iria", "irias", "iríamos", "iriam",
+ "fui", "foi", "quero", "queres", "quer",
"queremos", "querem", "queria", "querias", "queríamos", "queriam", "posso", "podes", "pode", "podemos",
"podem", "podia", "podias", "podíamos", "podiam", "poderia", "poderias", "poderíamos", "poderiam",
"preciso", "precisas", "precisa", "precisamos", "precisam", "precisava", "devo", "deves", "deve", "devemos",
@@ -3938,13 +4043,7 @@ public static string Apply(string s)
s = CommaClitic.Replace(s, m => ReplaceLeading(m, capitalize: false));
s = SubjectClitic.Replace(s, ReplaceSubject);
s = ModalClitic.Replace(s, ReplaceModal);
- s = LinkedInfinitiveClitic.Replace(s, m =>
- {
- var v = m.Groups["v"].Value;
- return PortugueseVerbs.IsInfinitive(v) || Regex.IsMatch(v, @"(?:ar|er|ir)(?:em|es|mos)$", RegexOptions.IgnoreCase)
- ? m.Groups["l"].Value + " " + PortugueseVerbs.AttachEnclitic(v, m.Groups["cl"].Value)
- : m.Value;
- });
+ s = LinkedInfinitiveClitic.Replace(s, ReplaceLinkedInfinitive);
s = NounSubjectClitic.Replace(s, ReplaceNounSubject);
s = AdverbClitic.Replace(s, m =>
{
@@ -4174,7 +4273,7 @@ private static string ReplaceObject(Match m)
private static readonly Regex InfinitiveProclisis = new(
@"(?(?eu|tu|ele|ela|nós|vocês|eles|elas)(?\s+))?" +
- @"(?vou|vais|vai|vamos|vão|ia|ias|íamos|iam|irei|irás|irá|iremos|irão|estou|estás|está|estamos|estão|estava|estavas|estávamos|estavam|" +
+ @"(?vou|vais|vai|vamos|vão|ia|ias|íamos|iam|iria|irias|iríamos|iriam|irei|irás|irá|iremos|irão|estou|estás|está|estamos|estão|estava|estavas|estávamos|estavam|" +
@"posso|podes|pode|podemos|podem|podia|podias|podíamos|podiam|quero|queres|quer|queremos|querem|queria|querias|queríamos|queriam|" +
@"devo|deves|deve|devemos|devem|devia|devias|devíamos|deviam)(?\s+)(?\p{L}+)-(?me|te|se|nos|vos|lhe|lhes)(?![\p{L}\p{M}-])", Ci);
@@ -4591,7 +4690,7 @@ void Add(Person p, params string[] forms)
private static readonly Regex Verb = new(
NotWordBefore + @"(?se\s+)?(?" + string.Join("|", BuildForms().Keys.OrderByDescending(k => k.Length)) + @")" + NotWordAfter + @"(?!-)" +
@"(?=(?\s+(?:de|do|da|dos|das|disso|disto|daquilo|daquele|daquela|daqueles|daquelas|dele|dela|deles|delas|desse|dessa|" +
- @"desses|dessas|deste|desta|destes|destas|dum|duma|dumas|duns|ti|mim|nós)" + NotWordAfter + @")|(?\s*(?:[.!?…,]|$)))",
+ @"desses|dessas|deste|desta|destes|destas|dum|duma|dumas|duns|ti|mim|nós)" + NotWordAfter + @")|(?\s*(?:[.!?…,]|$))|(?\s+(?:é|era|são|eram)\b))",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Multiline);
private static readonly Regex ClauseTail = new(@"(?:[^.!?…;\n]|\n(?![-–—]))*$", RegexOptions.CultureInvariant);
@@ -4638,11 +4737,15 @@ private static string Replace(string s, Match m, bool formal)
if (comma < 0 && Titles.Contains(previous ?? string.Empty)) formal = true;
// "não se lembra" already has it; only a Brazilian "Se lembra..." at the start is moved.
if (m.Groups["se"].Success && !bareStart) return m.Value;
+ if (m.Groups["relative"].Success && (esquecer || !Regex.IsMatch(clause,
+ @"\b(?:tudo\s+o\s+que|(?:a\s+)?(?:única\s+)?coisa\s+que)\s*$", Ci))) return m.Value;
if (m.Groups["end"].Success)
{
// At the end of the clause the object may be before it ("o que esqueci", "tudo o que lembro").
- if (words.Any(w => w.Equals("que", StringComparison.OrdinalIgnoreCase) || w.Equals("quê", StringComparison.OrdinalIgnoreCase) ||
+ var relativeRecall = !esquecer && Regex.IsMatch(clause,
+ @"\b(?:tudo\s+o\s+que|(?:a\s+)?(?:única\s+)?coisa\s+que)\s*$", Ci);
+ if (!relativeRecall && words.Any(w => w.Equals("que", StringComparison.OrdinalIgnoreCase) || w.Equals("quê", StringComparison.OrdinalIgnoreCase) ||
w.Equals("qual", StringComparison.OrdinalIgnoreCase))) return m.Value;
// "Esquece!" / "Esquece isso" (forget it) is fine in Portugal; only past and negative forms take the pronoun at the end.
if (esquecer && !Preterite.Contains(lower) && !(previous?.Equals("não", StringComparison.OrdinalIgnoreCase) ?? false)) return m.Value;
diff --git a/se5/BrazilianToEuropeanPortuguese/PortugueseOrthography.cs b/se5/BrazilianToEuropeanPortuguese/PortugueseOrthography.cs
index e27d8045..20cf0985 100644
--- a/se5/BrazilianToEuropeanPortuguese/PortugueseOrthography.cs
+++ b/se5/BrazilianToEuropeanPortuguese/PortugueseOrthography.cs
@@ -33,9 +33,13 @@ private static readonly (string Before, string After)[] Stems =
("crêem", "creem"), ("dêem", "deem"),
};
private static readonly Regex Word = new(@"[\p{L}\p{M}]+");
+ private static readonly Regex FinalInterrogativeQue = new(
+ @"(? CaseHelper.MatchCase(match.Value, "quê"));
var dictionary = NaturaDictionary.Load(postAgreement);
return Word.Replace(text, match =>
{
diff --git a/se5/BrazilianToEuropeanPortuguese/README.md b/se5/BrazilianToEuropeanPortuguese/README.md
index 21e105cd..1c227706 100644
--- a/se5/BrazilianToEuropeanPortuguese/README.md
+++ b/se5/BrazilianToEuropeanPortuguese/README.md
@@ -18,9 +18,14 @@ Earlier updates include reviewed workbook vocabulary and verb constructions,
English-confirmed sportswear and shared-residence expressions, physical descriptions,
finding filters, and original PT-BR text visible on warning-only rows.
-The standalone source build is **1.4.1**. Official Subtitle Edit package versions
+The standalone source build is **1.4.2**. Official Subtitle Edit package versions
are assigned by the upstream release workflow and may differ.
+Version **1.4.2** improves contextual agreement and formal address, reference-confirmed
+objects and vocabulary senses, natural dialogue constructions and interrogative
+accentuation. It adds regression coverage for these interactions while preserving
+subtitle cue timings and user-controlled rule options.
+
Converts Brazilian Portuguese (pt-BR) subtitles to natural European Portuguese (pt-PT):
spelling, vocabulary and grammar. Like *American to British*, it shows a checkable
preview of every changed line, so you can review and untick individual changes before
@@ -314,6 +319,12 @@ The **Orthography** selector chooses **Post-1990 agreement (AO90)** (default) or
Existing saved settings continue to use post-agreement spelling. Switching off
**Spelling** also switches off agreement conversion.
+With **Spelling** enabled, interrogative *que* immediately before a question
+mark receives its tonic accent: *Baseada em que?* → *Baseada em quê?*,
+*De que?* → *De quê?*. This applies in both orthographies, preserves casing
+and subtitle markup, and leaves *Que queres?* and *em que ideia?* unchanged.
+No English reference or MiniLM score is needed for this accentuation rule.
+
Reviewed spelling stems are checked against the selected European Portuguese
dictionary before a change is proposed. For example:
@@ -896,6 +907,160 @@ The conversion is rule- and dictionary-based, so **always review the preview**.
## Dialogue context, grammar review and layout
+Short action questions can ask what the **speaker** should do, rather than
+give an instruction. With **You → tu** and **Colloquial** enabled, an explicit
+English *Should I call …?*, or a bare *Call …?* immediately following an
+English *if you …* cue ending in an ellipsis, supports *Ligue para João?* →
+*Ligo para o João?*. The latter requires adjacent cues within 1.5 seconds.
+Other supported actions include asking, telling, waiting, going and helping.
+With **Pronouns** enabled, telephone questions add articles for reviewed
+personal names; unknown names keep their original article choice. Genuine
+commands/questions and formal address are not changed by this rule
+(`action-questions`). The reviewed masculine reading of the unisex name
+*Jamie* is limited to these telephone questions.
+
+Replies beginning *Não.* or *Sim.* no longer hide an English-confirmed **you**
+subject. *Não. Disse que iria me ajudar* can become *Não. Disseste que me ias
+ajudar* when English says *you said you were going to help me*; *would help*
+keeps the conditional *me irias ajudar*. Modal clitics after *que* use the
+existing proclisis rule. A named title in an identifying apposition such as
+*É a minha amiga, Sra. Silva* does not establish formal address for nearby
+cues; genuine vocatives and direct address remain formal.
+
+With **Vocabulary** enabled, reference-confirmed journey stops use
+*paragem/paragens*: *É uma pequena parada* → *É uma pequena paragem*.
+The `travel-stops` stage runs before colloquial *parada* → *coisa* handling,
+so the stopping sense is not lost. Unknown senses, stationary adjectives and
+military parades are not blanket replacements; existing medical vocabulary
+continues to use its own rules.
+
+Reference-confirmed constructions also cover standalone happening questions
+(*O que está havendo?* → *O que se está a passar?*), informal *espera até*
+with personal infinitives (*Espera até ver* → *Espera até veres*), and
+acquisition beneficiaries (*Alugamos por ti* → *Alugamos para ti*).
+The beneficiary rule distinguishes *for you* from *instead of/on behalf of you*.
+With **WordOrder** enabled, English modal-plus-*always* supports
+*sempre pode ajudar* → *pode sempre ajudar*, including other modal persons.
+With **Vocabulary** and **Colloquial** enabled, explanatory English *the thing is*
+supports *O negócio é que…* → *A questão é que…*; literal business/object senses
+and unconfirmed introductions stay unchanged. A split introduction such as
+*O negócio é* becomes *A questão é*, leaving the following cue's *que* intact.
+
+Reference-confirmed informal subordinate verbs accept intervening negatives
+and adverbs: *que não tem* → *que não tens*, *que ainda pode* → *que ainda podes*.
+Repeated English *you're* subjects also confirm coordinated agreement after
+reply prefixes: *Certo, você é adulto e é o diretor* →
+*Certo, és adulto e és o diretor*. Copular titles such as *é o diretor* describe
+a role rather than establish formal address; genuine title vocatives remain formal.
+
+With **Pronouns** enabled, English-confirmed family subjects receive definite
+articles: *Mãe e tio Pedro* → *A Mãe e o tio Pedro*, *Pai está acordado* →
+*O Pai está acordado*. Existing capitalization is preserved; this rule does
+not impose capital letters on ordinary family nouns. Vocatives such as *Mãe!*
+or *Mãe, ajuda!* remain article-free.
+With **Pronouns** and informal **YouToTu** enabled, reviewed English past
+actions with object *you* distinguish it from a third-person Portuguese
+clitic: *o encontraram e o levaram* → *encontraram-te e levaram-te* for
+*found you and got you to the hospital*. Verb tense and subject number remain
+unchanged. The rule covers finding, seeing, helping, calling, transporting,
+rescuing and saving, with negative/subordinate triggers retaining proclisis.
+Formal address, ambiguous mixed objects and missing references are protected.
+English *brought you* can also select *trazer* with **Vocabulary** enabled;
+*got/took you to* retains *levar*. Whether the destination is the speaker's
+current location requires scene knowledge: edit to *trouxeram-te* when appropriate,
+rather than automatically changing every *levar*.
+
+Conversational recall uses the reflexive construction in *Tudo o que lembro*
+→ *Tudo o que me lembro*, including other recognized persons and split
+subtitle lines. Direct reminder uses such as *o que lembro ao João* remain
+unchanged. With **Colloquial**, **Pronouns** and **Vocabulary** enabled,
+English-confirmed departure slang *mandando-se daqui* becomes *saindo daqui*;
+finite forms such as *mandou-se daqui* become *saiu daqui*. Literal sending
+is preserved. Standalone departure commands with **Colloquial** and
+**Pronouns** use *Vá-se / Vai-te / Vão-se*, preserving formal/informal
+agreement; narrative *ele vai embora* and inclusive *vamos embora* stay unchanged.
+English-confirmed coordinated topic questions can put the subject first:
+*Sobre o que você e João discutiram?* →
+*Você e o João discutiram sobre o quê?* in formal address. Informal address
+retains *tu*. Name articles use the reviewed name genders, not capitalization alone.
+English *Are you sure…?* supports *Tem/Tens a certeza de que…*.
+In *want me to…*, a recoverable embedded *eu* can be omitted without changing
+its first-person verb: *Tem a certeza de que não quer que desembale aquilo?*.
+Ellipsis vocatives such as *-Detetive…* establish formal register even when
+another speaker's line follows in the same cue; existing timing, speaker,
+informal-boundary and title-apposition guards remain.
+
+With **Vocabulary** enabled, English *responded to the scene/club/incident*
+selects emergency-response *responder* rather than *atender*, across supported
+verb forms: *quando atenderam no clube* → *quando responderam no clube*.
+Telephone answering and replies to letters are not included.
+English *went into arrest* or explicit *cardiac arrest* selects the medical
+sense: *teve uma parada* → *teve uma paragem cardíaca*. Explicit
+*cardiorespiratory arrest* uses *paragem cardiorrespiratória*. Journey stops,
+police arrests and unconfirmed bare *parada* do not trigger this expansion.
+The aligned medical phrase is sufficient; earlier deaths alone are not used
+to infer the diagnosis. MiniLM compares individual cue meanings and flags
+possible mismatches; its similarity score cannot guarantee recognition of
+an implicit diagnosis and it does not generate a correction.
+
+With **Vocabulary** and **Colloquial** enabled, reference-confirmed
+*slow day/morning/afternoon/night/week/month* repairs an adverb incorrectly
+used as an adjective: *dia devagar* → *dia lento*, *manhã devagar* →
+*manhã lenta*, including plurals. This repairs a source translation error,
+not a general PT-BR/PT-PT difference. Valid adverbial uses such as
+*o dia passou devagar* and cases without a matching reference are preserved.
+
+Informal address also covers shared predicates, not just the first verb:
+*Você é péssimo pescando, odeia golfe* → *És péssimo a pescar, odeias golfe*.
+Known verb forms share the subject across commas and *e/mas/ou* when the
+English reference confirms repeated **you** subjects. Without a reference,
+the rule is limited to copular heads; named subjects, pronouns and subordinate
+clauses block propagation. It does not infer a subject for unrelated cues.
+An English-confirmed *if you … you …* clause can repair omitted subjects in
+*se dissesse que iria sair* → *se dissesses que irias sair*, without changing a
+different person's verb elsewhere in the sentence. This works within an
+individual cue, including a sentence continuation, without enabling sentence
+context. Both repairs respect formal address and the `address` rule switch.
+
+Reference-confirmed dropped subjects also work after introductory adverbs:
+*Bem, talvez precise do trabalho* → *Bem, talvez precises do trabalho*.
+Conditional and temporal heads use the same verb tools, including irregular
+forms: *E se precisar de ajuda* → *E se precisares de ajuda*, *Quando tiver
+tempo* → *Quando tiveres tempo*. These changes require an aligned English
+**you** subject and informal address; unknown or explicitly different subjects
+stay unchanged. *O trabalho não precisa de mim* keeps **precisa**, because the
+subject is the job, not the person being addressed.
+
+With **You → tu**, **Pronouns** and **Colloquial** enabled, an explicit informal
+subject plus an untriggered direct-object conditional uses a spoken infinitive
+construction: *Você a deixaria* → *Irias deixá-la*, *Você o faria* →
+*Irias fazê-lo*. Regular and supported irregular transitive verbs use the
+shared clitic allomorph helper. Negative/subordinate proclisis and other clitic
+types keep their existing treatment; this is not a blanket replacement of
+conditionals or a change of tense.
+
+With **Pronouns** enabled, complements of *pensar* use the normal spoken PT-PT
+article before reviewed, capitalized personal names: *pensar em Maria* →
+*pensar na Maria*, *penso em João* → *penso no João*. The rule covers conjugated
+forms, infinitives, participles and coordinated complements, preserving line
+breaks. It does not guess gender from spelling: unknown names, places and
+generic complements such as *pensar em alguém*, *pensar em pessoas* and
+*pensar em sair* remain unchanged. It does not change other verbs' complements.
+The rule ID is `personal-name-complements`.
+
+Linked infinitives after *mas*, as well as *e*, *ou*, *depois* and *a*, use
+the shared pronoun-placement rule: *mas me derrubar* → *mas derrubar-me*,
+*mas te proteger* → *mas proteger-te*, *a se vestir* → *a vestir-se*.
+This is not a verb-specific replacement: regular, irregular and personal
+infinitives use the existing verb tools and dictionary validation, including
+*pôr/compor*. Negation and intervening attracting words are not removed
+(*mas não me derrubar* stays). The **Pronoun placement** option controls it.
+Ambiguous *e/ou/mas se + infinitive* is not treated as a reflexive clitic:
+conditional **se** stays before the verb, even without a reference or with
+address conversion disabled. For example, *E se precisar* never becomes
+*E precisar-se*. Clear reflexives after *a/depois* retain the shared placement
+rule; an ambiguous coordinated reflexive may need manual review.
+
**Dialogue context and subtitle layout** exposes the same settings in preview and
Batch convert:
@@ -1126,6 +1291,12 @@ names differ after the episode code (`Show.S01E01.720p.pt-br.srt` and
*esse/essa/nesse/dessa...* become *isto/disto/nisto*, *este/esta/neste/desta...* (*I got this
one.* → *Eu cuido disto*; *this morning* → *esta manhã*). *Por isso* and the verb *desse*
(from *dar*) are kept. Without a reference, *isso/esse* are never changed.
+- Referential English *that* also supports *isto/disto/nisto* →
+ *isso/disso/nisso*: *Sim, isto funcionaria?* → *Sim, isso funcionaria?*
+ for *Yeah, would that work?*. This direction uses reviewed pronoun
+ constructions, not conjunction *that* or noun determiners, and is suppressed
+ when the English cue also contains *this/these/those*. Without a reference,
+ no distal reading is inferred.
- **Lines to review:** when the English says *you/your* but the line still has *você* or
*seu/sua*, it is listed with an orange note (*Keep it if formal; change to tu/teu if informal*).
Nothing is changed automatically; edit the line directly in the plugin if needed,
diff --git a/se5/BrazilianToEuropeanPortuguese/README.pt-PT.md b/se5/BrazilianToEuropeanPortuguese/README.pt-PT.md
index f1723c4c..f068c6fa 100644
--- a/se5/BrazilianToEuropeanPortuguese/README.pt-PT.md
+++ b/se5/BrazilianToEuropeanPortuguese/README.pt-PT.md
@@ -22,10 +22,16 @@ partir de folhas de cálculo, vestuário desportivo e expressões de residência
confirmados pelo inglês, descrições físicas, filtros de resultados e o texto
original em PT-BR visível nas linhas que contêm apenas avisos.
-A compilação do repositório autónomo é a **1.4.1**. As versões oficiais dos
+A compilação do repositório autónomo é a **1.4.2**. As versões oficiais dos
pacotes do Subtitle Edit são atribuídas pelo fluxo de lançamento do projeto
principal e podem ser diferentes.
+A versão **1.4.2** melhora a concordância contextual e o tratamento formal,
+os complementos e sentidos de vocabulário confirmados pela referência, as
+construções naturais de diálogo e a acentuação interrogativa. Acrescenta testes
+de regressão destas interações, preservando os tempos das legendas e as opções
+de regras controladas pelo utilizador.
+
Converte legendas de português do Brasil (pt-BR) para português europeu (pt-PT),
adaptando a ortografia, o vocabulário e a gramática. Tal como o plugin *American to
British*, apresenta uma pré-visualização de cada legenda alterada, com uma caixa
@@ -344,6 +350,12 @@ incluindo para **Batch convert**. As definições já guardadas continuam a usar
ortografia pós-acordo. Desativar **Spelling** também desativa a conversão entre
ortografias.
+Com **Spelling** ativado, o *que* interrogativo imediatamente antes do ponto
+de interrogação recebe acento tónico: *Baseada em que?* → *Baseada em quê?*,
+*De que?* → *De quê?*. A regra aplica-se nas duas ortografias, preserva
+maiúsculas e marcação das legendas e mantém *Que queres?* e *em que ideia?*.
+Esta regra de acentuação não exige referência inglesa nem pontuação do MiniLM.
+
Os radicais ortográficos revistos são verificados no dicionário de português
europeu selecionado antes de se propor uma alteração. Por exemplo:
@@ -1092,6 +1104,177 @@ pré-visualização**.
## Contexto do diálogo, revisão gramatical e disposição das linhas
+Uma pergunta curta sobre uma ação pode perguntar o que **a própria pessoa**
+deve fazer, em vez de dar uma instrução. Com **You → tu** e **Colloquial**
+ativados, uma pergunta inglesa explícita como *Should I call …?*, ou
+*Call …?* logo após uma fala inglesa com *if you …* terminada em reticências,
+permite *Ligue para João?* → *Ligo para o João?*. Neste segundo caso, as
+falas têm de ser adjacentes e estar separadas por, no máximo, 1,5 segundos.
+As ações reconhecidas também incluem perguntar, dizer, esperar, ir e ajudar.
+Com **Pronouns** ativado, as perguntas sobre telefonar acrescentam artigos
+antes de nomes de pessoas revistos; os nomes desconhecidos mantêm a escolha
+de artigo original. Esta regra (`action-questions`) não altera ordens ou
+perguntas genuínas nem o tratamento formal. A leitura masculina revista do
+nome unissexo *Jamie* limita-se a estas perguntas sobre telefonar.
+
+As respostas iniciadas por *Não.* ou *Sim.* deixam de ocultar um sujeito
+**you** confirmado pela referência inglesa. *Não. Disse que iria me ajudar*
+pode passar a *Não. Disseste que me ias ajudar* quando o inglês diz
+*you said you were going to help me*; *would help* mantém o condicional
+*me irias ajudar*. Os pronomes com verbos modais após *que* usam a regra
+existente de próclise. Um nome com título num aposto identificativo, como
+*É a minha amiga, Sra. Silva*, não impõe tratamento formal às falas próximas;
+os vocativos genuínos e o tratamento direto continuam a ser formais.
+
+Com **Vocabulary** ativado, as paragens durante um percurso confirmadas pela
+referência usam *paragem/paragens*: *É uma pequena parada* →
+*É uma pequena paragem*. A etapa `travel-stops` ocorre antes do tratamento
+coloquial *parada* → *coisa*, para não perder o sentido de paragem.
+Os sentidos desconhecidos, os adjetivos que indicam imobilidade e as paradas
+militares não são substituídos indiscriminadamente; o vocabulário médico
+existente continua a usar as suas próprias regras.
+
+As construções confirmadas pela referência também abrangem perguntas
+independentes sobre acontecimentos (*O que está havendo?* →
+*O que se está a passar?*), *espera até* informal com infinitivo pessoal
+(*Espera até ver* → *Espera até veres*) e destinatários de aquisições
+(*Alugamos por ti* → *Alugamos para ti*). Esta última regra distingue
+*for you* de *instead of/on behalf of you*.
+Com **WordOrder** ativado, um verbo modal seguido de *always* na referência
+permite *sempre pode ajudar* → *pode sempre ajudar*, também noutras pessoas.
+Com **Vocabulary** e **Colloquial** ativados, a introdução explicativa inglesa
+*the thing is* permite *O negócio é que…* → *A questão é que…*. Os sentidos
+literais de negócio ou objeto e as introduções sem confirmação são preservados.
+Se a introdução terminar em *O negócio é*, passa a *A questão é*, mantendo
+o *que* da legenda seguinte.
+
+Os verbos subordinados informais confirmados pela referência aceitam negativas
+e advérbios intermédios: *que não tem* → *que não tens*, *que ainda pode* →
+*que ainda podes*. Sujeitos *you're* repetidos também confirmam a concordância
+coordenada após introduções de resposta: *Certo, você é adulto e é o diretor* →
+*Certo, és adulto e és o diretor*. Títulos predicativos como *é o diretor*
+descrevem uma função, sem impor tratamento formal; os verdadeiros vocativos
+com títulos continuam a ser formais.
+
+Com **Pronouns** ativado, os sujeitos familiares confirmados pelo inglês
+recebem artigo definido: *Mãe e tio Pedro* → *A Mãe e o tio Pedro*,
+*Pai está acordado* → *O Pai está acordado*. Preservam-se as maiúsculas
+existentes; a regra não impõe maiúsculas nos nomes de parentesco comuns.
+Os vocativos *Mãe!* e *Mãe, ajuda!* continuam sem artigo.
+Com **Pronouns** e **YouToTu** informal ativados, ações inglesas no passado
+com complemento *you* distinguem-no de um clítico português de terceira pessoa:
+*o encontraram e o levaram* → *encontraram-te e levaram-te* quando a referência
+diz *found you and got you to the hospital*. Mantêm-se o tempo verbal e o
+número do sujeito. A regra abrange encontrar, ver, ajudar, chamar, transportar,
+resgatar e salvar; negativas e subordinadas mantêm a próclise.
+O tratamento formal, complementos mistos ambíguos e casos sem referência
+são preservados. *Brought you* também pode selecionar *trazer*, com
+**Vocabulary** ativado; *got/took you to* mantém *levar*.
+Saber se o destino coincide com o local atual do falante exige conhecimento
+da cena: nesses casos, edite para *trouxeram-te*, em vez de substituir
+automaticamente todos os usos de *levar*.
+
+A recordação em registo conversacional usa a construção reflexa em
+*Tudo o que lembro* → *Tudo o que me lembro*, também noutras pessoas
+reconhecidas e em legendas repartidas por linhas. Mantêm-se usos de lembrar
+algo a alguém, como *o que lembro ao João*. Com **Colloquial**, **Pronouns**
+e **Vocabulary** ativados, a referência inglesa que confirma uma saída
+permite *mandando-se daqui* → *saindo daqui* e *mandou-se daqui* →
+*saiu daqui*. Mantêm-se os sentidos literais de enviar.
+Ordens de saída independentes, com **Colloquial** e **Pronouns** ativados,
+usam *Vá-se / Vai-te / Vão-se*, preservando o tratamento formal ou informal;
+mantêm-se *ele vai embora* narrativo e *vamos embora* inclusivo.
+Perguntas sobre um assunto com sujeito coordenado, confirmadas pelo inglês,
+podem colocar o sujeito primeiro: *Sobre o que você e João discutiram?* →
+*Você e o João discutiram sobre o quê?* no tratamento formal.
+No informal mantém-se *tu*. Os artigos dos nomes usam géneros revistos,
+não apenas a presença de maiúscula.
+*Are you sure…?* permite *Tem/Tens a certeza de que…*.
+Em *want me to…*, pode omitir-se o *eu* subordinado recuperável, sem mudar
+a pessoa verbal: *Tem a certeza de que não quer que desembale aquilo?*.
+Vocativos com reticências, como *-Detetive…*, estabelecem tratamento formal
+mesmo com uma segunda fala na mesma legenda; mantêm-se os limites temporais,
+as mudanças de falante, as fronteiras informais e as proteções das aposições.
+
+Com **Vocabulary** ativado, *responded to the scene/club/incident* na referência
+seleciona *responder* no sentido de responder a uma ocorrência, em vez de
+*atender*, nas formas verbais reconhecidas: *quando atenderam no clube* →
+*quando responderam no clube*. Atender o telefone ou responder a cartas
+não faz parte desta regra.
+*Went into arrest* ou *cardiac arrest* na referência seleciona o sentido
+médico: *teve uma parada* → *teve uma paragem cardíaca*.
+*Cardiorespiratory arrest* explícito usa *paragem cardiorrespiratória*.
+As paragens de percurso, as detenções policiais e *parada* sem confirmação
+não desencadeiam esta expansão. A expressão médica alinhada é suficiente;
+a menção anterior a mortes não serve, por si só, para deduzir o diagnóstico.
+O MiniLM compara o sentido de cada legenda e assinala possíveis divergências;
+a pontuação de semelhança não garante o reconhecimento de um diagnóstico
+implícito e não gera uma correção.
+
+Com **Vocabulary** e **Colloquial** ativados, *slow day/morning/afternoon/night/
+week/month* confirmado pela referência corrige o advérbio usado indevidamente
+como adjetivo: *dia devagar* → *dia lento*, *manhã devagar* → *manhã lenta*,
+também no plural. Trata-se de corrigir um erro da tradução de origem, não
+de uma diferença geral entre PT-BR e PT-PT. Mantêm-se usos adverbiais válidos
+como *o dia passou devagar* e casos sem referência correspondente.
+
+O tratamento informal também abrange predicados com sujeito partilhado, não
+apenas o primeiro verbo: *Você é péssimo pescando, odeia golfe* →
+*És péssimo a pescar, odeias golfe*. As formas verbais reconhecidas partilham
+o sujeito após vírgulas e *e/mas/ou* quando a referência inglesa confirma
+sujeitos **you** repetidos. Sem referência, a regra limita-se a verbos de
+ligação no início; nomes próprios, pronomes e orações subordinadas impedem
+a propagação. Não deduz o sujeito de falas independentes.
+Uma oração inglesa com *if you … you …* pode corrigir sujeitos omitidos em
+*se dissesse que iria sair* → *se dissesses que irias sair*, sem alterar o
+verbo de outra pessoa na mesma frase. Funciona numa fala individual, incluindo
+a continuação de uma frase, sem ativar o contexto entre falas. Ambas as
+correções respeitam o tratamento formal e o interruptor da regra `address`.
+
+Os sujeitos omitidos confirmados pela referência também são reconhecidos após
+advérbios introdutórios: *Bem, talvez precise do trabalho* →
+*Bem, talvez precises do trabalho*. As orações condicionais e temporais usam
+as mesmas ferramentas verbais, incluindo formas irregulares:
+*E se precisar de ajuda* → *E se precisares de ajuda*, *Quando tiver tempo* →
+*Quando tiveres tempo*. Estas alterações exigem um sujeito **you** na referência
+inglesa alinhada e tratamento informal; sujeitos desconhecidos ou explicitamente
+diferentes ficam inalterados. *O trabalho não precisa de mim* mantém
+**precisa**, porque o sujeito é o trabalho, não a pessoa a quem se fala.
+
+Com **You → tu**, **Pronouns** e **Colloquial** ativados, um sujeito informal
+explícito com um pronome de complemento direto antes de um condicional, sem
+elementos que exijam próclise, usa uma construção falada com infinitivo:
+*Você a deixaria* → *Irias deixá-la*, *Você o faria* → *Irias fazê-lo*.
+Os verbos transitivos regulares e irregulares reconhecidos usam a ferramenta
+partilhada de junção dos pronomes. A próclise negativa ou subordinada e os
+outros tipos de pronome mantêm o tratamento existente; não é uma substituição
+indiscriminada dos condicionais nem uma mudança de tempo verbal.
+
+Com **Pronouns** ativado, os complementos de *pensar* usam o artigo habitual
+no PT-PT falado antes de nomes próprios de pessoas revistos e escritos com
+inicial maiúscula: *pensar em Maria* → *pensar na Maria*, *penso em João* →
+*penso no João*. A regra abrange formas conjugadas, infinitivos, particípios
+e complementos coordenados, preservando as quebras de linha. Não deduz o
+género pela grafia: nomes desconhecidos, lugares e complementos genéricos
+como *pensar em alguém*, *pensar em pessoas* e *pensar em sair* ficam
+inalterados. Não altera os complementos de outros verbos.
+O identificador da regra é `personal-name-complements`.
+
+Os infinitivos ligados por *mas*, tal como por *e*, *ou*, *depois* e *a*,
+usam a regra partilhada de colocação dos pronomes:
+*mas me derrubar* → *mas derrubar-me*, *mas te proteger* → *mas proteger-te*,
+*a se vestir* → *a vestir-se*. Não é uma substituição específica de um verbo:
+os infinitivos regulares, irregulares e pessoais usam as ferramentas verbais
+existentes e a validação pelo dicionário, incluindo *pôr/compor*.
+Não se removem a negação nem palavras intercaladas que atraem o pronome
+(*mas não me derrubar* mantém-se). A opção **Pronoun placement** controla a regra.
+As construções ambíguas *e/ou/mas se + infinitivo* não são tratadas como pronomes
+reflexos: a conjunção condicional **se** mantém-se antes do verbo, mesmo sem
+referência ou com a conversão do tratamento desativada. Por exemplo,
+*E se precisar* nunca passa a *E precisar-se*. Os reflexos claros após
+*a/depois* mantêm a regra partilhada de colocação; um reflexo coordenado
+ambíguo pode precisar de revisão manual.
+
**Dialogue context and subtitle layout** disponibiliza as mesmas definições
na pré-visualização e em **Batch convert**:
@@ -1382,6 +1565,12 @@ local models (optional)** e use **Browse…** para o escolher:
e *este/esta/neste/desta...* (*I got this one.* → *Eu cuido disto*;
*this morning* → *esta manhã*). Mantêm-se *Por isso* e o verbo *desse*
(de *dar*). Sem referência, *isso/esse* nunca são alterados.
+- O pronome referencial inglês *that* também permite *isto/disto/nisto* →
+ *isso/disso/nisso*: *Sim, isto funcionaria?* → *Sim, isso funcionaria?*
+ quando a referência diz *Yeah, would that work?*. Esta direção usa
+ construções pronominais reconhecidas, não a conjunção *that* nem
+ determinantes de nomes, e fica desativada se a mesma legenda inglesa
+ também contiver *this/these/those*. Sem referência, não se deduz esta leitura.
- **Linhas a rever:** quando o inglês diz *you/your*, mas a legenda ainda
contém *você* ou *seu/sua*, esta é listada com uma nota laranja:
manter no tratamento formal; mudar para *tu/teu* no informal.
diff --git a/se5/BrazilianToEuropeanPortuguese/ReferenceSubtitle.cs b/se5/BrazilianToEuropeanPortuguese/ReferenceSubtitle.cs
index 40f7affe..28c6a5a7 100644
--- a/se5/BrazilianToEuropeanPortuguese/ReferenceSubtitle.cs
+++ b/se5/BrazilianToEuropeanPortuguese/ReferenceSubtitle.cs
@@ -17,6 +17,9 @@ public sealed record ReferenceHint(bool SecondPerson, bool SecondPossessive, boo
public bool InclusiveContinuation { get; init; }
public bool CatchUpLater { get; init; }
internal bool RepeatedYouSubject { get; init; }
+ internal bool RepeatedConditionalYouSubject { get; init; }
+ internal bool ConditionalYouSubject { get; init; }
+ internal bool SelfActionQuestion { get; init; }
internal bool SecondPersonWhatSubject { get; init; }
internal string? EnglishText { get; init; }
@@ -24,6 +27,14 @@ public sealed record ReferenceHint(bool SecondPerson, bool SecondPossessive, boo
IReadOnlyList? speakers = null)
{
var hint = FromText(english?[index]);
+ if (hint != null && index > 0 && english != null &&
+ InitialConditionalYouSubject.IsMatch(ReferenceAligner.Clean(english[index - 1] ?? "")) &&
+ source[index].StartMs >= source[index - 1].StartMs &&
+ source[index].StartMs - source[index - 1].EndMs <= 1500 &&
+ Regex.IsMatch(source[index - 1].Text, @"(?:\.\.\.|…)\s*$") &&
+ Regex.IsMatch(hint.EnglishText ?? "", @"^(?:call|phone|ring|ask|tell|wait|leave|go|come|help|take|do)\b[^.!;]*\?$",
+ RegexOptions.IgnoreCase | RegexOptions.CultureInvariant))
+ hint = hint with { SelfActionQuestion = true };
if (index > 0 && source[index].StartMs >= source[index - 1].StartMs &&
source[index].StartMs - source[index - 1].EndMs <= 5000 &&
!DialogueRegister.DifferentSpeaker(source[index - 1].Text, source[index].Text) &&
@@ -118,11 +129,23 @@ public sealed record ReferenceHint(bool SecondPerson, bool SecondPossessive, boo
.OrderByDescending(word => word.Length)
.Select(Regex.Escape));
private static readonly Regex InitialYouSubject = new(
- @"^\s*(?:(?:well|so|then|but|and|now|hey|look|listen|okay|ok|all\s+right)\b[,!?;:]?\s*)?(?:you\b|you['’](?:re|ll|ve|d)\b|y['’]all\b)",
+ @"^\s*(?:(?:no|yes)\s*[.,!]\s*)?" +
+ @"(?:(?:well|so|then|but|and|now|hey|look|listen|okay|ok|all\s+right)\b[,!?;:]?\s*)?" +
+ @"(?:(?:maybe|perhaps|probably|surely|certainly)\s+){0,2}(?:you\b|you['’](?:re|ll|ve|d)\b|y['’]all\b)",
+ RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
+ private static readonly Regex InitialConditionalYouSubject = new(
+ @"^\s*(?:(?:well|so|then|but|and|or)\b[,!?;:]?\s*)?" +
+ @"(?:(?:(?:what|even|only)\s+)?if|when|whenever|unless|as\s+soon\s+as)\s+" +
+ @"you(?=\s+(?!(?:and|or|all|both|guys)\b)\p{L})",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
private static readonly Regex YouSubject = new(
@"(? pattern.Matches(text).Cast().Any(m =>
+ {
+ if (!NamedTitle.IsMatch(m.Value) || DirectAddressTail.IsMatch(text[(m.Index + m.Length)..])) return true;
+ var comma = m.Value.IndexOf(',');
+ var before = text[..(m.Index + (comma >= 0 ? comma + 1 : 0))];
+ return !PersonApposition.IsMatch(before);
+ });
internal static bool IsFormal(IReadOnlyList source, int index, IReadOnlyList? english = null,
IReadOnlyList? speakers = null)
@@ -239,8 +284,8 @@ internal static bool IsFormal(IReadOnlyList source, int index, IReadOn
}
return false;
- bool Address(int i) => PortugueseAddress.IsMatch(Plain(source[i].Text)) ||
- english != null && EnglishAddress.IsMatch(Plain(english[i] ?? string.Empty));
+ bool Address(int i) => HasAddress(Plain(source[i].Text), PortugueseAddress) ||
+ english != null && HasAddress(Plain(english[i] ?? string.Empty), EnglishAddress);
}
private static string Plain(string text) => Regex.Replace(text, @"<[^<>]*>|\{[^{}]*\}", " ");
@@ -258,7 +303,7 @@ private static string SpeakerOf(string text) =>
Regex.Match(Plain(text), @"^\s*(?[\p{Lu}][\p{Lu}\d _'-]{1,35}):").Groups["name"].Value;
internal static bool ConflictingAddress(string text) =>
- PortugueseAddress.IsMatch(Plain(text)) && Informal.IsMatch(Plain(text));
+ HasAddress(Plain(text), PortugueseAddress) && Informal.IsMatch(Plain(text));
}
public sealed record TimeMap(double Scale, double OffsetMs)