dupeguru/hscommon/loc.py

106 lines
3.5 KiB
Python
Raw Permalink Normal View History

2019-09-09 19:54:28 -05:00
import os
import os.path as op
import shutil
import tempfile
2022-05-09 23:36:39 -05:00
from typing import Any, List
2019-09-09 19:54:28 -05:00
import polib
2022-05-09 01:40:08 -05:00
from hscommon import pygettext
2019-09-09 19:54:28 -05:00
LC_MESSAGES = "LC_MESSAGES"
2019-09-09 19:54:28 -05:00
2022-05-09 23:36:39 -05:00
def get_langs(folder: str) -> List[str]:
2019-09-09 19:54:28 -05:00
return [name for name in os.listdir(folder) if op.isdir(op.join(folder, name))]
2022-05-09 23:36:39 -05:00
def files_with_ext(folder: str, ext: str) -> List[str]:
2019-09-09 19:54:28 -05:00
return [op.join(folder, fn) for fn in os.listdir(folder) if fn.endswith(ext)]
2022-05-09 23:36:39 -05:00
def generate_pot(folders: List[str], outpath: str, keywords: Any, merge: bool = False) -> None:
2019-09-09 19:54:28 -05:00
if merge and not op.exists(outpath):
merge = False
if merge:
_, genpath = tempfile.mkstemp()
else:
genpath = outpath
pyfiles = []
for folder in folders:
for root, dirs, filenames in os.walk(folder):
keep = [fn for fn in filenames if fn.endswith(".py")]
2019-09-09 19:54:28 -05:00
pyfiles += [op.join(root, fn) for fn in keep]
pygettext.main(pyfiles, outpath=genpath, keywords=keywords)
if merge:
merge_po_and_preserve(genpath, outpath)
try:
os.remove(genpath)
except Exception:
print("Exception while removing temporary folder %s\n", genpath)
2019-09-09 19:54:28 -05:00
2022-05-09 23:36:39 -05:00
def compile_all_po(base_folder: str) -> None:
2019-09-09 19:54:28 -05:00
langs = get_langs(base_folder)
for lang in langs:
pofolder = op.join(base_folder, lang, LC_MESSAGES)
pofiles = files_with_ext(pofolder, ".po")
2019-09-09 19:54:28 -05:00
for pofile in pofiles:
p = polib.pofile(pofile)
p.save_as_mofile(pofile[:-3] + ".mo")
2019-09-09 19:54:28 -05:00
2022-05-09 23:36:39 -05:00
def merge_locale_dir(target: str, mergeinto: str) -> None:
2019-09-09 19:54:28 -05:00
langs = get_langs(target)
for lang in langs:
if not op.exists(op.join(mergeinto, lang)):
continue
mofolder = op.join(target, lang, LC_MESSAGES)
mofiles = files_with_ext(mofolder, ".mo")
2019-09-09 19:54:28 -05:00
for mofile in mofiles:
shutil.copy(mofile, op.join(mergeinto, lang, LC_MESSAGES))
2022-05-09 23:36:39 -05:00
def merge_pots_into_pos(folder: str) -> None:
2019-09-09 19:54:28 -05:00
# We're going to take all pot files in `folder` and for each lang, merge it with the po file
# with the same name.
potfiles = files_with_ext(folder, ".pot")
2019-09-09 19:54:28 -05:00
for potfile in potfiles:
refpot = polib.pofile(potfile)
refname = op.splitext(op.basename(potfile))[0]
for lang in get_langs(folder):
po = polib.pofile(op.join(folder, lang, LC_MESSAGES, refname + ".po"))
2019-09-09 19:54:28 -05:00
po.merge(refpot)
po.save()
2022-05-09 23:36:39 -05:00
def merge_po_and_preserve(source: str, dest: str) -> None:
2019-09-09 19:54:28 -05:00
# Merges source entries into dest, but keep old entries intact
sourcepo = polib.pofile(source)
destpo = polib.pofile(dest)
for entry in sourcepo:
if destpo.find(entry.msgid) is not None:
# The entry is already there
continue
destpo.append(entry)
destpo.save()
2022-05-09 23:36:39 -05:00
def normalize_all_pos(base_folder: str) -> None:
2019-09-09 19:54:28 -05:00
"""Normalize the format of .po files in base_folder.
2019-09-09 19:54:28 -05:00
When getting POs from external sources, such as Transifex, we end up with spurious diffs because
of a difference in the way line wrapping is handled. It wouldn't be a big deal if it happened
once, but these spurious diffs keep overwriting each other, and it's annoying.
2019-09-09 19:54:28 -05:00
Our PO files will keep polib's format. Call this function to ensure that freshly pulled POs
are of the right format before committing them.
"""
langs = get_langs(base_folder)
for lang in langs:
pofolder = op.join(base_folder, lang, LC_MESSAGES)
pofiles = files_with_ext(pofolder, ".po")
2019-09-09 19:54:28 -05:00
for pofile in pofiles:
p = polib.pofile(pofile)
p.save()