Compare commits
1
Commits
1fdc0006d6
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
561bb14736 |
@@ -564,10 +564,38 @@ class QualityValidator:
|
|||||||
'visualizar', 'acessar', 'baixar', 'compartilhar'
|
'visualizar', 'acessar', 'baixar', 'compartilhar'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Corrupção conhecida introduzida por motores de MT (LibreTranslate/DeepL):
|
||||||
|
# inserem espaços dentro de especificadores printf posicionais, ex.
|
||||||
|
# "%1$s" -> "% 1$s", "%1$.2f" -> "% 1$. 2f". sprintf() do PHP 8 lança
|
||||||
|
# ValueError com isto -> fatal error no site.
|
||||||
|
#
|
||||||
|
# Âncora obrigatória: \d+\$ (posicional). Nunca ocorre em prosa PT-PT —
|
||||||
|
# "%" seguido de espaço e dígito sozinho (ex. "% d" em "50% do total")
|
||||||
|
# É ambíguo com texto legítimo, por isso NÃO é corrigido automaticamente.
|
||||||
|
REPAIRABLE_PATTERNS = [
|
||||||
|
(r'%\s+(\d+\$)', r'%\1'), # "% 1$s" -> "%1$s"
|
||||||
|
(r'(\d+\$)\.\s+(\d)', r'\1.\2'), # "1$. 2f" -> "1$.2f"
|
||||||
|
]
|
||||||
|
|
||||||
|
def repair_placeholders(self, msgstr: str) -> str:
|
||||||
|
"""Corrige automaticamente corrupções conhecidas e seguras de placeholders."""
|
||||||
|
repaired = msgstr
|
||||||
|
for pattern, replacement in self.REPAIRABLE_PATTERNS:
|
||||||
|
repaired = re.sub(pattern, replacement, repaired)
|
||||||
|
return repaired
|
||||||
|
|
||||||
def validate_entry(self, entry: PoEntry) -> Tuple[bool, List[str]]:
|
def validate_entry(self, entry: PoEntry) -> Tuple[bool, List[str]]:
|
||||||
"""Validate a complete entry."""
|
"""Validate a complete entry."""
|
||||||
errors = []
|
errors = []
|
||||||
|
|
||||||
|
# 0. Reparar corrupções conhecidas ANTES de validar. Isto cobre tanto
|
||||||
|
# traduções novas como entradas já corrompidas revalidadas em modo
|
||||||
|
# --brands-only — sem isto, o mismatch era apenas detectado e a
|
||||||
|
# entrada revertida para o original (que já vinha corrompido),
|
||||||
|
# preservando o bug silenciosamente em vez de o corrigir.
|
||||||
|
if entry.msgstr:
|
||||||
|
entry.msgstr = self.repair_placeholders(entry.msgstr)
|
||||||
|
|
||||||
# 1. Check placeholders
|
# 1. Check placeholders
|
||||||
if not self._check_placeholders(entry.msgid, entry.msgstr):
|
if not self._check_placeholders(entry.msgid, entry.msgstr):
|
||||||
errors.append("PLACEHOLDER_MISMATCH")
|
errors.append("PLACEHOLDER_MISMATCH")
|
||||||
|
|||||||
Reference in New Issue
Block a user