-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathuntranslated_messages.py
More file actions
115 lines (93 loc) · 3.56 KB
/
untranslated_messages.py
File metadata and controls
115 lines (93 loc) · 3.56 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
"""Checks for untranslated messages in PO files.
Returns an error code if a PO file has an untranslated message.
"""
import argparse
import sys
def check_untranslated_messages(filenames, min_=None, quiet=False):
"""Warns about all unstranslated messages found in a set of PO files.
Parameters
----------
filenames : list
Set of file names to check.
quiet : bool, optional
Enabled, don't print output to stderr when an untranslated message is found.
Returns
-------
int: 0 if no untranslated messages found, 1 otherwise.
"""
min_string = str(min_ if min_ is not None else 0)
exitcode = 0
for filename in filenames:
with open(filename) as f:
content_lines = f.readlines()
if len(content_lines) > 4: # skip first empty message
content_lines = content_lines[4:]
untranslated_messages, total_messages = 0, -1
for i, line in enumerate(content_lines):
next_i = i + 1
if line.startswith('msgid "'):
total_messages += 1
if line.startswith('msgstr ""') and (
next_i == len(content_lines) or (not content_lines[next_i].strip())
):
exitcode = 1
untranslated_messages += 1
if not quiet and min_ is None:
sys.stderr.write(f"Untranslated message at {filename}:{i + 5}\n")
if min_ is not None:
_is_percent = False
if min_string[-1] == "%":
min_float = total_messages / 100 * float(min_string[:-1])
_is_percent = True
else:
min_float = float(min)
translated_messages = total_messages - untranslated_messages
if min_float > translated_messages:
exitcode = 1
if not quiet:
if _is_percent:
translation_percent = max(
100,
translated_messages / max(1, total_messages) * 100,
)
sys.stderr.write(
"Lower percent of translation"
f" ({round(translation_percent, 3)}) than minimum"
f" required ({min_string}) at file {filename}\n"
)
else:
sys.stderr.write(
"Lower number of messages translated"
f" ({translated_messages}) than required"
f" ({min_string}) at file {filename}\n"
)
return exitcode
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
"filenames", nargs="*", help="Filenames to check for untranslated messages"
)
parser.add_argument(
"-m",
"--min",
type=str,
metavar="N/N%%",
required=False,
default=None,
dest="min",
help=(
"Minimum messages translated in each PO file to be considered valid."
" You can pass either a float number optionally ending in a character"
" %% to indicate that is a percentage of the total of translated"
" entries in each PO file."
),
)
parser.add_argument("-q", "--quiet", action="store_true", help="Supress output")
args = parser.parse_args()
return check_untranslated_messages(
args.filenames,
min_=args.min,
quiet=args.quiet,
)
if __name__ == "__main__":
exit(main())