schon/core/management/commands/fix_fuzzy.py
Egor fureunoir Gorbunov e49c942a1b Features: 1) Add detailed in-line comments with type ignore for improved debugging and maintainability; 2) Update I18N strings and translation placeholders across locales; 3) Introduce "address set" as a translatable object;
Fixes: 1) Resolve malformed phone number error message format; 2) Fix minor grammatical issues in message strings; 3) Align POT-Creation-Date metadata in locale files;

Extra: Enhance formatting consistency in documentation and translations; Remove obsolete translation strings.
2025-07-14 16:22:19 +03:00

88 lines
2.8 KiB
Python

import os
from django.conf import settings
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = (
"Traverse all .po files under BASE_DIR (or a given base-dir), "
"remove 'fuzzy' flags, drop '#| msgid' comments, and reset msgstr to empty."
)
def add_arguments(self, parser):
parser.add_argument(
"-b",
"--base-dir",
default=settings.BASE_DIR,
help="Root directory to start searching for .po files (default: settings.BASE_DIR).",
)
def handle(self, *args, **options):
base_dir = options["base_dir"]
for root, _dirs, files in os.walk(base_dir):
for fname in files:
if not fname.endswith(".po"):
continue
path = os.path.join(root, fname)
self.stdout.write(f"→ Processing {path}")
self._clean_po_file(path)
def _clean_po_file(self, filepath):
with open(filepath, encoding="utf-8") as f:
lines = f.readlines()
entries, curr = [], []
for line in lines:
if line.strip() == "":
if curr:
entries.append(curr)
curr = []
else:
curr.append(line)
if curr:
entries.append(curr)
new_lines = []
changed = False
for ent in entries:
if ent and ent[0].startswith('msgid ""'):
new_lines.extend(ent)
new_lines.append("\n")
continue
if any(
line.startswith("#~") or (line.startswith("#,") and line.lstrip("#, ").startswith("msgid "))
for line in ent
):
changed = True
continue
fuzzy_idx = next(
(i for i, line in enumerate(ent) if line.startswith("#,") and "fuzzy" in line),
None,
)
if fuzzy_idx is not None:
flags = [f.strip() for f in ent[fuzzy_idx][2:].split(",") if f.strip() != "fuzzy"]
if flags:
ent[fuzzy_idx] = "#, " + ", ".join(flags) + "\n"
else:
del ent[fuzzy_idx]
ent = [line for line in ent if not line.startswith("#| msgid")]
ent = ['msgstr ""\n' if line.startswith("msgstr") else line for line in ent]
changed = True
new_lines.extend(ent)
new_lines.append("\n")
if changed:
with open(filepath, "w", encoding="utf-8") as f:
f.writelines(new_lines)
self.stdout.write(self.style.SUCCESS(f" → Updated {filepath}"))
else:
self.stdout.write(" (no changes)")