wesnoth/po/SConscript
Pentarctagon a64ed84a48 Explicitly use python3 in translations.
Ubuntu 20.04 no longer has the python link or python2 by default.
2020-11-10 11:43:36 +03:00

146 lines
6 KiB
Python

# vi: syntax=python:et:ts=4
from glob import glob
from subprocess import Popen, PIPE
import os, shutil
import re
from fnmatch import fnmatch
from os.path import join
Import("env")
def remove_pot_cdate(path):
return "".join([line for line in open(path).readlines() if "POT-Creation-Date: " not in line])
def update_pot(target, source, env):
pot = target[0].path
new_pot = source[0].path
if not os.path.exists(new_pot): return
if remove_pot_cdate(new_pot) != remove_pot_cdate(pot):
shutil.copy2(new_pot, pot)
print(pot + " updated.")
os.remove(new_pot)
#
# Gettext message catalog generation
#
textdomains = glob("wesnoth*")
po4a_domains = Split("wesnoth-manpages wesnoth-manual")
textdomains = [domain for domain in textdomains if os.path.isdir(domain)]
linguas = Split(open("LINGUAS").read())
if "pot-update" in COMMAND_LINE_TARGETS:
from collections import defaultdict
domain_sources = defaultdict(list)
for root, dirs, files in os.walk("../src"):
for file in files:
if fnmatch(file, "*.[hc]pp"):
match = re.search('^#define\\s+GETTEXT_DOMAIN\\s+"wesnoth(-.*)"', Dir(root).File(file).get_contents().decode("utf-8"), re.MULTILINE)
if match:
source_domain = match.group(1)
else:
source_domain = ""
domain_sources[source_domain].append(Dir(root).File(file).path)
for domain in textdomains:
pot = File(join(domain, domain + ".pot"))
env.Precious(pot)
NoClean(pot)
env.Alias("pot-update", pot)
if domain in po4a_domains:
continue
with open(join(domain, "POTFILES.in"), "w") as potfiles:
potfiles.writelines([line + "\n" for line in sorted(domain_sources[domain[7:]])])
sources = [Dir("#").File(x) for x in domain_sources[domain[7:]]]
if sources:
source_pot = env.Command(
join(domain, domain + ".cpp.pot"),
sources,
"""xgettext --force-po --default-domain=%s --directory=. --add-comments=TRANSLATORS: \
--from-code=UTF-8 --sort-by-file \
--keyword=_ --keyword=N_ --keyword=sgettext --keyword=vgettext --keyword=VGETTEXT \
--keyword=_n:1,2 --keyword=sngettext:1,2 --keyword=vngettext:1,2 --keyword=VNGETTEXT:1,2 \
--files-from=%s --copyright-holder='Wesnoth development team' --msgid-bugs-address=https://bugs.wesnoth.org/ \
--output=$TARGET \
; sed -i s/charset=CHARSET/charset=UTF-8/ $TARGET \
""" % (domain, join("po", domain, "POTFILES.in"))
)
cfgs = []
FINDCFG = join(domain, "FINDCFG")
if os.path.exists(FINDCFG):
cfgs = Split(Popen(["sh", join("po", FINDCFG)], stdout = PIPE, cwd = "..").communicate()[0].decode("utf-8"))
cfgs = [File(x, Dir("..")) for x in cfgs]
if cfgs:
wml_pot = env.Command(
join(domain, domain + ".wml.pot"),
cfgs,
"data/tools/wmlxgettext --directory=. --domain=%s $SOURCES -o $TARGET" % domain
)
new_pot = str(pot) + ".new"
if cfgs and sources:
env.Command(new_pot, [source_pot, wml_pot],
[
"msgcat --sort-by-file $SOURCES -o $TARGET",
Delete(wml_pot),
Delete(source_pot)
]
)
elif cfgs:
env.Command(new_pot, wml_pot, ["msgcat --sort-by-file $SOURCES -o $TARGET", Delete(wml_pot)])
else:
env.Command(new_pot, source_pot, ["msgcat --sort-by-file $SOURCES -o $TARGET", Delete(source_pot)])
env.Command(pot, new_pot, Action(update_pot))
env.Alias("pot-update", "../translations", "python3 utils/po_stat.py --update-cfg --textdomains=wesnoth,wesnoth-editor,wesnoth-help,wesnoth-lib,wesnoth-multiplayer,wesnoth-tutorial,wesnoth-units")
if "update-po" in COMMAND_LINE_TARGETS or "pot-update" in COMMAND_LINE_TARGETS or "update-po4a" in COMMAND_LINE_TARGETS:
for domain in textdomains:
for lingua in linguas:
update_po = env.MsgInitMerge(
os.path.join(domain, lingua),
os.path.join(domain, domain)
)
env.Precious(update_po)
NoClean(update_po)
env.Alias(lingua, [update_po, join("../translations", lingua)])
if lingua in COMMAND_LINE_TARGETS:
env.AlwaysBuild(update_po)
env.Alias("update-po", [])
#
# Manual and man pages translation
#
if "update-po4a" in COMMAND_LINE_TARGETS or "pot-update" in COMMAND_LINE_TARGETS:
env.Po4aGettextize("wesnoth-manual/wesnoth-manual.pot", "../doc/manual/manual.en.xml", PO4A_FORMAT = "docbook")
for lingua in linguas:
env.Po4aTranslate("../doc/manual/manual." + lingua + ".xml",
["../doc/manual/manual.en.xml", join("wesnoth-manual", lingua + ".po")],
PO4A_CHARSET = "utf8", PO4A_FORMAT = "docbook")
Alias("update-po4a", Alias("manual"))
manpages = Split("wesnoth.6 wesnothd.6")
env.Po4aGettextize("wesnoth-manpages/wesnoth-manpages.pot",
[join("../doc/man", man) for man in manpages], PO4A_FORMAT = "man")
for lingua in linguas:
for man in manpages:
env.Po4aTranslate(join("../doc/man", lingua, man),
[join("../doc/man", man), join("wesnoth-manpages", lingua + ".po")],
PO4A_CHARSET = "utf8", PO4A_FORMAT = "man")
Alias("update-po4a", "../doc/man")
#
# If we have the right tool in place, create targets to invoke msgfmt to
# compile message catalogs to binary format at installation time.
# Without this step, the i18n support won't work. Note, the actions
# this generates should fire only when installing data.
#
if env["nls"]:
for domain in textdomains:
for lingua in linguas:
env.Msgfmt(
join("../translations", lingua, "LC_MESSAGES", domain),
join(domain, lingua)
)