77'''
88
99import os , json
10- from sys import stdout # for dynamic prints
10+ from sys import stdout # for dynamic prints
1111from translate import Translator
1212
13- locales_folder = '_locales' ; provider = ''
13+ locales_folder = '_locales'
14+ provider = ''
1415target_langs = ['af' , 'am' , 'ar' , 'az' , 'be' , 'bem' , 'bg' , 'bn' , 'bo' , 'bs' , 'ca' , 'ceb' , 'cs' , 'cy' , 'da' , 'de' , 'dv' , 'dz' , 'el' , 'en' , 'en-GB' , 'eo' , 'es' , 'et' , 'eu' , 'fa' , 'fi' , 'fo' , 'fr' , 'gd' , 'gl' , 'gu' , 'haw' , 'he' , 'hi' , 'hr' , 'ht' , 'hu' , 'hy' , 'id' , 'is' , 'it' , 'ja' , 'ka' , 'kab' , 'kk' , 'km' , 'kn' , 'ko' , 'ku' , 'ky' , 'la' , 'lb' , 'lo' , 'lt' , 'lv' , 'mg' , 'mi' , 'mk' , 'ml' , 'mn' , 'ms' , 'mt' , 'my' , 'ne' , 'nl' , 'no' , 'ny' , 'pa' , 'pap' , 'pl' , 'ps' , 'pt' , 'ro' , 'ru' , 'rw' , 'sg' , 'si' , 'sk' , 'sl' , 'sm' , 'sn' , 'so' , 'sr' , 'sv' , 'sw' , 'ta' , 'te' , 'tg' , 'th' , 'ti' , 'tk' , 'tn' , 'to' , 'tpi' , 'tr' , 'uk' , 'ur' , 'uz' , 'vi' , 'xh' , 'yi' , 'zh' , 'zh-CN' , 'zh-HK' , 'zh-SG' , 'zh-TW' , 'zu' ]
1516
1617# UI initializations
1718terminal_width = os .get_terminal_size ()[0 ]
18- def print_trunc (msg , end = '\n ' ) : print (msg if len (msg ) < terminal_width else msg [0 :terminal_width - 4 ] + '...' , end = end )
19- def overwrite_print (msg ) : stdout .write ('\r ' + msg .ljust (terminal_width )[:terminal_width ])
19+
20+ def print_trunc (msg , end = '\n ' ):
21+ print (msg if len (msg ) < terminal_width else msg [0 : terminal_width - 4 ] + '...' , end = end )
22+
23+ def overwrite_print (msg ):
24+ stdout .write ('\r ' + msg .ljust (terminal_width )[:terminal_width ])
2025
2126print ('' )
2227
2328# Prompt user for keys to ignore
2429keys_to_ignore = []
2530while True :
2631 key = input ('Enter key to ignore (or ENTER if done): ' )
27- if not key : break
32+ if not key :
33+ break
2834 keys_to_ignore .append (key )
2935
3036# Determine closest locales dir
3137print_trunc (f'\n Searching for { locales_folder } ...' )
3238script_dir = os .path .abspath (os .path .dirname (__file__ ))
3339locales_dir = None
34- for root , dirs , files in os .walk (script_dir ): # search script dir recursively
40+ for root , dirs , files in os .walk (script_dir ): # search script dir recursively
3541 if locales_folder in dirs :
36- locales_dir = os .path .join (root , locales_folder ) ; break
37- else : # search script parent dirs recursively
42+ locales_dir = os .path .join (root , locales_folder )
43+ break
44+ else : # search script parent dirs recursively
3845 parent_dir = os .path .dirname (script_dir )
3946 while parent_dir and parent_dir != script_dir :
4047 for root , dirs , files in os .walk (parent_dir ):
4148 if locales_folder in dirs :
42- locales_dir = os .path .join (root , locales_folder ) ; break
43- if locales_dir : break
49+ locales_dir = os .path .join (root , locales_folder )
50+ break
51+ if locales_dir :
52+ break
4453 parent_dir = os .path .dirname (parent_dir )
45- else : locales_dir = None
54+ else :
55+ locales_dir = None
4656
4757# Print result
48- if locales_dir : print_trunc (f'_locales directory found!\n \n >> { locales_dir } \n ' )
49- else : print_trunc (f'Unable to locate a { locales_folder } directory.' ) ; exit ()
58+ if locales_dir :
59+ print_trunc (f'_locales directory found!\n \n >> { locales_dir } \n ' )
60+ else :
61+ print_trunc (f'Unable to locate a { locales_folder } directory.' )
62+ exit ()
5063
5164# Load en/messages.json
5265msgs_filename = 'messages.json'
@@ -55,39 +68,47 @@ def overwrite_print(msg) : stdout.write('\r' + msg.ljust(terminal_width)[:termin
5568 en_messages = json .load (en_file )
5669
5770# Combine [target_langs] w/ languages discovered in _locales
58- output_langs = list (set (target_langs )) # remove duplicates
71+ output_langs = list (set (target_langs )) # remove duplicates
5972for root , dirs , files in os .walk (locales_dir ):
6073 for folder in dirs :
6174 folder_path = os .path .join (root , folder )
6275 msgs_path = os .path .join (folder_path , msgs_filename )
6376 discovered_lang = folder .replace ('_' , '-' )
64- if os .path .exists (msgs_path ) and discovered_lang not in output_langs : output_langs .append (discovered_lang )
65- output_langs .sort () # alphabetize languages
77+ if os .path .exists (msgs_path ) and discovered_lang not in output_langs :
78+ output_langs .append (discovered_lang )
79+ output_langs .sort () # alphabetize languages
6680
6781# Create/update/translate [[output_langs]/messages.json]
6882langs_added , langs_skipped , langs_translated , langs_not_translated = [], [], [], []
6983for lang_code in output_langs :
7084 lang_added , lang_skipped , lang_translated = False , False , False
71- folder = lang_code .replace ('-' , '_' ) ; translated_msgs = {}
72- if '-' in lang_code : # cap suffix
85+ folder = lang_code .replace ('-' , '_' )
86+ translated_msgs = {}
87+ if '-' in lang_code : # cap suffix
7388 sep_index = folder .index ('_' )
74- folder = folder [:sep_index ] + '_' + folder [sep_index + 1 :].upper ()
89+ folder = folder [:sep_index ] + '_' + folder [sep_index + 1 :].upper ()
7590
7691 # Skip English locales
7792 if lang_code .startswith ('en' ):
7893 print_trunc (f'Skipped { folder } /messages.json...' )
79- langs_skipped .append (lang_code ) ; langs_not_translated .append (lang_code ) ; continue
94+ langs_skipped .append (lang_code )
95+ langs_not_translated .append (lang_code )
96+ continue
8097
8198 # Initialize target locale folder
8299 folder_path = os .path .join (locales_dir , folder )
83- if not os .path .exists (folder_path ): # if missing, create folder
84- os .makedirs (folder_path ) ; langs_added .append (lang_code ) ; lang_added = True
100+ if not os .path .exists (folder_path ): # if missing, create folder
101+ os .makedirs (folder_path )
102+ langs_added .append (lang_code )
103+ lang_added = True
85104
86105 # Initialize target messages
87106 msgs_path = os .path .join (folder_path , msgs_filename )
88107 if os .path .exists (msgs_path ):
89- with open (msgs_path , 'r' , encoding = 'utf-8' ) as messages_file : messages = json .load (messages_file )
90- else : messages = {}
108+ with open (msgs_path , 'r' , encoding = 'utf-8' ) as messages_file :
109+ messages = json .load (messages_file )
110+ else :
111+ messages = {}
91112
92113 # Attempt translations
93114 print_trunc (f"{ 'Adding' if not messages else 'Updating' } { folder } /messages.json..." , end = '' )
@@ -97,7 +118,7 @@ def overwrite_print(msg) : stdout.write('\r' + msg.ljust(terminal_width)[:termin
97118 for key in en_keys :
98119 if key in keys_to_ignore :
99120 translated_msg = en_messages [key ]['message' ]
100- translated_msgs [key ] = { 'message' : translated_msg }
121+ translated_msgs [key ] = {'message' : translated_msg }
101122 continue
102123 if key not in messages :
103124 original_msg = translated_msg = en_messages [key ]['message' ]
@@ -109,23 +130,28 @@ def overwrite_print(msg) : stdout.write('\r' + msg.ljust(terminal_width)[:termin
109130 except Exception as e :
110131 print_trunc (f'Translation failed for key "{ key } " in { lang_code } /messages.json: { e } ' )
111132 translated_msg = original_msg
112- translated_msgs [key ] = { 'message' : translated_msg }
113- else : translated_msgs [key ] = messages [key ]
133+ translated_msgs [key ] = {'message' : translated_msg }
134+ else :
135+ translated_msgs [key ] = messages [key ]
114136
115137 # Format messages
116138 formatted_msgs = '{\n '
117139 for index , (key , message_data ) in enumerate (translated_msgs .items ()):
118- formatted_msg = json .dumps (message_data , ensure_ascii = False ) \
119- .replace ('{' , '{ ' ).replace ('}' , ' }' ) # add spacing
120- formatted_msgs += ( f' "{ key } ": { formatted_msg } '
121- + ( ',\n ' if index < len (translated_msgs ) - 1 else '\n ' )) # terminate line
140+ formatted_msg = json .dumps (message_data , ensure_ascii = False ).replace ('{' , '{ ' ).replace ('}' , ' }' ) # add spacing
141+ formatted_msgs += f' "{ key } ": { formatted_msg } ' + (',\n ' if index < len (translated_msgs ) - 1 else '\n ' ) # terminate line
122142 formatted_msgs += '}'
123- with open (msgs_path , 'w' , encoding = 'utf-8' ) as output_file : output_file .write (formatted_msgs + '\n ' )
143+ with open (msgs_path , 'w' , encoding = 'utf-8' ) as output_file :
144+ output_file .write (formatted_msgs + '\n ' )
124145
125146 # Print file summary
126- if translated_msgs == messages : langs_skipped .append (lang_code ) ; lang_skipped = True
127- elif translated_msgs != messages : langs_translated .append (lang_code ) ; lang_translated = True
128- if not lang_translated : langs_not_translated .append (lang_code )
147+ if translated_msgs == messages :
148+ langs_skipped .append (lang_code )
149+ lang_skipped = True
150+ elif translated_msgs != messages :
151+ langs_translated .append (lang_code )
152+ lang_translated = True
153+ if not lang_translated :
154+ langs_not_translated .append (lang_code )
129155 overwrite_print (f"{ 'Added' if lang_added else 'Skipped' if lang_skipped else 'Updated' } { folder } /messages.json" )
130156
131157# Print final summary
@@ -136,4 +162,4 @@ def overwrite_print(msg) : stdout.write('\r' + msg.ljust(terminal_width)[:termin
136162 list_name = next (name for name , value in globals ().items () if value is data )
137163 status = list_name .split ('langs_' )[- 1 ].replace ('_' , ' ' )
138164 print (f'Languages { status } : { len (data )} \n ' ) # print tally
139- print ('[ ' + ', ' .join (data ) + ' ]\n ' ) # list languages
165+ print ('[ ' + ', ' .join (data ) + ' ]\n ' ) # list languages
0 commit comments