-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdesktop-merge
executable file
·61 lines (52 loc) · 2.05 KB
/
desktop-merge
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2020 Pier Luigi Fiorini <[email protected]>
#
# SPDX-License-Identifier: GPL-3.0-or-later
import glob
import io
import os
import re
import polib
def get_translations(po_dirname):
translations = {}
for filename in glob.glob(os.path.join(po_dirname, '*.po')):
po = polib.pofile(filename, encoding='UTF-8')
valid_entries = [e for e in po if not e.obsolete]
messages = {}
for entry in valid_entries:
if entry.msgstr:
messages[entry.msgid] = entry.msgstr
if messages:
lang = po.metadata['Language']
translations[lang] = messages
return translations
def merge(template_filename, dst_filename, translations):
f = io.open(dst_filename, 'w', encoding='utf-8')
with io.open(template_filename, 'r', encoding='utf-8') as template:
for line in template.readlines():
line = line.rstrip()
# Marked lines are translated, other lines are written verbatim
m = re.match(r'^\s*(_*)([A-Za-z0-9\-]+)\s*=\s*(.*)', line)
if m:
marked = m.group(1)
key = m.group(2)
value = m.group(3)
f.write(f'{key}={value}\n')
if marked:
for lang in sorted(translations.keys()):
for msgid, msgstr in translations[lang].items():
if value == msgid:
trvalue = translations[lang][msgid]
f.write(f'{key}[{lang}]={trvalue}\n')
else:
f.write(line + '\n')
f.close()
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('dir', help='PO files directory')
parser.add_argument('template', help='Desktop file template')
parser.add_argument('dest', help='Destination desktop file')
args = parser.parse_args()
translations = get_translations(args.dir)
merge(args.template, args.dest, translations)