import os
from argparse import ArgumentParser
from functools import lru_cache
from subprocess import check_output
import polib
parser = ArgumentParser()
parser.add_argument(
"path",
nargs="?",
default=None,
help="Path to the .po file or directory containing .po files",
)
parser.add_argument(
"--no-cache", action="store_true", default=False, help="Don't use cache"
)
args = parser.parse_args()
def main():
global git_root
total_progress = False
git_root = get_git_root()
if args.no_cache:
progress.cache_clear()
get_git_root.cache_clear()
if args.path is None:
print("No path specified, showing total progress...")
args.path = os.path.abspath(git_root).replace("\\", "/")
total_progress = True
else:
args.path = os.path.abspath(args.path).replace("\\", "/")
if os.path.isfile(args.path):
paths = [args.path]
elif os.path.isdir(args.path):
paths = []
for root, _, files in os.walk(args.path):
paths.extend(
os.path.join(root, file) for file in files if file.endswith(".po")
)
paths = map(lambda x: x.replace("\\", "/"), paths)
else:
print("Invalid path")
return -1
try:
progress(tuple(paths), total_progress)
return 0
except Exception as e:
print(f"Error: {e}")
return -1
@lru_cache(maxsize=512)
def progress(paths, total_progress=False):
total = 0
translated = 0
previous = "/"
is_root = True
for path in paths:
pofile = polib.pofile(path)
total += len(pofile) - len(pofile.obsolete_entries())
translated += len(pofile.translated_entries())
path = path.replace(f"{git_root}", "")
if is_root and len(path.split("/")) == 2:
print()
print("PYTHON-DOCS-TR")
print("-" * 14)
is_root = False
if (previous.split("/")[1] != path.split("/")[1]) and len(path.split("/")) > 2:
print()
print(path.split("/")[1].upper())
print("-" * len(path.split("/")[1].upper()))
previous = path
print(f"{path}: {pofile.percent_translated()}%")
dir_path = args.path.replace(f"{git_root}", "/").replace("//", "/")
total_progress_of = "/" if total_progress else dir_path
print()
print(
f"Total progress of {total_progress_of}: {round(translated / total * 100, 2)}%"
) if len(paths) > 1 else None
@lru_cache(maxsize=1)
def get_git_root():
return os.path.abspath(
check_output(["git", "rev-parse", "--show-toplevel"]).decode("utf-8").strip()
).replace("\\", "/")
if __name__ == "__main__":
main()