77import sys
88
99
10- def check_untranslated_messages (filenames , quiet = False ):
10+ def check_untranslated_messages (filenames , min_ = None , quiet = False ):
1111 """Warns about all unstranslated messages found in a set of PO files.
1212
1313 Parameters
@@ -24,6 +24,8 @@ def check_untranslated_messages(filenames, quiet=False):
2424
2525 int: 0 if no untranslated messages found, 1 otherwise.
2626 """
27+ min_string = str (min_ if min_ is not None else 0 )
28+
2729 exitcode = 0
2830 for filename in filenames :
2931 with open (filename ) as f :
@@ -32,17 +34,50 @@ def check_untranslated_messages(filenames, quiet=False):
3234 if len (content_lines ) > 4 : # skip first empty message
3335 content_lines = content_lines [4 :]
3436
37+ untranslated_messages , total_messages = 0 , - 1
38+
3539 for i , line in enumerate (content_lines ):
3640 next_i = i + 1
3741
42+ if line .startswith ('msgid "' ):
43+ total_messages += 1
44+
3845 if line .startswith ('msgstr ""' ) and (
3946 next_i == len (content_lines ) or (not content_lines [next_i ].strip ())
4047 ):
48+ exitcode = 1
49+ untranslated_messages += 1
50+ if not quiet and min_ is None :
51+ sys .stderr .write (f"Untranslated message at { filename } :{ i + 5 } \n " )
52+
53+ if min_ is not None :
54+ _is_percent = False
55+ if min_string [- 1 ] == "%" :
56+ min_float = total_messages / 100 * float (min_string [:- 1 ])
57+ _is_percent = True
58+ else :
59+ min_float = float (min )
60+
61+ translated_messages = total_messages - untranslated_messages
62+ if min_float > translated_messages :
4163 exitcode = 1
4264 if not quiet :
43- sys .stderr .write (
44- f"Found untranslated message at { filename } :{ i + 5 } \n "
45- )
65+ if _is_percent :
66+ translation_percent = max (
67+ 100 ,
68+ translated_messages / max (1 , total_messages ) * 100 ,
69+ )
70+ sys .stderr .write (
71+ "Lower percent of translation"
72+ f" ({ round (translation_percent , 3 )} ) than minimum"
73+ f" required ({ min_string } ) at file { filename } \n "
74+ )
75+ else :
76+ sys .stderr .write (
77+ "Lower number of messages translated"
78+ f" ({ translated_messages } ) than required"
79+ f" ({ min_string } ) at file { filename } \n "
80+ )
4681
4782 return exitcode
4883
@@ -52,9 +87,28 @@ def main():
5287 parser .add_argument (
5388 "filenames" , nargs = "*" , help = "Filenames to check for untranslated messages"
5489 )
90+ parser .add_argument (
91+ "-m" ,
92+ "--min" ,
93+ type = str ,
94+ metavar = "N/N%" ,
95+ required = False ,
96+ default = None ,
97+ dest = "min" ,
98+ help = (
99+ "Minimum messages translated in each PO file to be considered valid."
100+ " You can pass either a float number optionally ending in a character"
101+ " % to indicate that is a percentage of the total of translated"
102+ " entries in each PO file."
103+ ),
104+ )
55105 parser .add_argument ("-q" , "--quiet" , action = "store_true" , help = "Supress output" )
56106 args = parser .parse_args ()
57- return check_untranslated_messages (args .filenames , quiet = args .quiet )
107+ return check_untranslated_messages (
108+ args .filenames ,
109+ min_ = args .min ,
110+ quiet = args .quiet ,
111+ )
58112
59113
60114if __name__ == "__main__" :
0 commit comments