2019-02-21 20:57:23 -05:00
|
|
|
# Validate that all entries in the .pot are in every .po. Only the .pot is updated so we can detect
|
|
|
|
# if a translation was added to the source but isn't in a .po. This ensures translators can grab
|
|
|
|
# complete files to work on.
|
|
|
|
|
|
|
|
import git
|
|
|
|
import sys
|
|
|
|
import polib
|
|
|
|
|
|
|
|
po_filenames = sys.argv[1:]
|
|
|
|
repo = git.Repo()
|
|
|
|
|
|
|
|
NO_TRANSLATION_WHITELIST = ["ffi_prep_closure_loc"]
|
|
|
|
|
|
|
|
bad_commits = {}
|
|
|
|
for po_filename in po_filenames:
|
|
|
|
print("Checking", po_filename)
|
|
|
|
|
|
|
|
commits = repo.iter_commits(paths=po_filename, reverse=True, topo_order=True)
|
|
|
|
first_translations = None
|
|
|
|
fixed_ids = set()
|
|
|
|
for commit in commits:
|
|
|
|
try:
|
|
|
|
blob = commit.tree / po_filename
|
|
|
|
except KeyError:
|
|
|
|
continue
|
|
|
|
try:
|
|
|
|
current_file = polib.pofile(blob.data_stream.read().decode("utf-8"))
|
|
|
|
except OSError:
|
|
|
|
print("skipping invalid po in", commit)
|
|
|
|
continue
|
|
|
|
if not first_translations:
|
|
|
|
first_translations = current_file
|
|
|
|
continue
|
|
|
|
print(commit.authored_date, commit)
|
|
|
|
first_translations.metadata = current_file.metadata
|
2019-02-22 18:28:29 -05:00
|
|
|
first_translations.header = current_file.header
|
2019-02-21 20:57:23 -05:00
|
|
|
for entry in first_translations:
|
|
|
|
newer_entry = current_file.find(entry.msgid)
|
2019-02-22 18:28:29 -05:00
|
|
|
|
|
|
|
if newer_entry and entry.msgid == "":
|
|
|
|
entry.merge(newer_entry)
|
|
|
|
print(entry)
|
|
|
|
elif newer_entry and entry.msgstr != newer_entry.msgstr:
|
2019-02-21 20:57:23 -05:00
|
|
|
if newer_entry.msgstr != "" and (newer_entry.msgstr != entry.msgid or entry.msgid in NO_TRANSLATION_WHITELIST):
|
|
|
|
entry.merge(newer_entry)
|
|
|
|
entry.msgstr = newer_entry.msgstr
|
2019-02-22 18:28:29 -05:00
|
|
|
if "fuzzy" not in newer_entry.flags and "fuzzy" in entry.flags:
|
|
|
|
entry.flags.remove("fuzzy")
|
2019-02-21 20:57:23 -05:00
|
|
|
elif entry.msgid not in fixed_ids:
|
|
|
|
if commit not in bad_commits:
|
|
|
|
bad_commits[commit] = set()
|
|
|
|
bad_commits[commit].add(po_filename)
|
|
|
|
fixed_ids.add(entry.msgid)
|
2019-02-22 18:28:29 -05:00
|
|
|
#print(entry.msgid, "\"" + entry.msgstr + "\"", "\"" + newer_entry.msgstr + "\"",)
|
|
|
|
elif newer_entry and newer_entry.flags != entry.flags:
|
|
|
|
entry.flags = newer_entry.flags
|
|
|
|
elif newer_entry and newer_entry.obsolete != entry.obsolete:
|
|
|
|
entry.obsolete = newer_entry.obsolete
|
|
|
|
elif not newer_entry:
|
|
|
|
entry.obsolete = True
|
|
|
|
|
|
|
|
# Add new entries to the modified pofile.
|
|
|
|
for entry in current_file:
|
|
|
|
old_entry = first_translations.find(entry.msgid, include_obsolete_entries=True)
|
|
|
|
if old_entry:
|
|
|
|
continue
|
|
|
|
first_translations.append(entry)
|
|
|
|
|
|
|
|
# Remove obsolete translations. We can always use this script to revive them from the git history.
|
|
|
|
to_remove = []
|
|
|
|
for entry in first_translations:
|
|
|
|
if entry.obsolete:
|
|
|
|
to_remove.append(entry)
|
|
|
|
|
|
|
|
for remove in to_remove:
|
|
|
|
first_translations.remove(remove)
|
2019-02-21 20:57:23 -05:00
|
|
|
|
|
|
|
first_translations.save(po_filename)
|
|
|
|
|
|
|
|
print()
|
|
|
|
for commit in bad_commits:
|
|
|
|
files = bad_commits[commit]
|
|
|
|
print(commit)
|
|
|
|
for file in files:
|
|
|
|
print("\t",file)
|