11'''
22Name: translate-en-messages
3- Version: 2026.2.10.29
3+ Version: 2026.2.10.30
44Author: Adam Lui
55Description: Translate en/messages.json to other locales
66Homepage: https://github.com/adamlui/python-utils
2525parser .add_argument ('--locales-dir' , type = str , help = 'Name of folder containing locales' )
2626parser .add_argument ('--provider' , type = str , help = 'Name of provider to use for translation' )
2727parser .add_argument ('--init' , action = 'store_true' , help = 'Create .config.json file to store defaults' )
28- args = parser .parse_args ()
29- locales_dir = args .locales_dir or cli .config_data .get ('locales_dir' , '' ) or '_locales'
30- provider = args .provider or cli .config_data .get ('provider' , '' )
28+ cli . args = parser .parse_args ()
29+ cli . locales_dir = cli . args .locales_dir or cli .config_data .get ('locales_dir' , '' ) or '_locales'
30+ cli . provider = cli . args .provider or cli .config_data .get ('provider' , '' )
3131
32- if args .init : # create config file
32+ if cli . args .init : # create config file
3333 if os .path .exists (cli .config_path ):
3434 print (f'Config already exists at { cli .config_path } ' )
3535 else :
4545
4646# Init target_locales
4747def parse_csv_val (val ) : return [item .strip () for item in val .split (',' ) if item .strip ()]
48- include_arg = args .include_langs or cli .config_data .get ('include_langs' , '' )
49- exclude_arg = args .exclude_langs or cli .config_data .get ('exclude_langs' , '' )
48+ include_arg = cli . args .include_langs or cli .config_data .get ('include_langs' , '' )
49+ exclude_arg = cli . args .exclude_langs or cli .config_data .get ('exclude_langs' , '' )
5050target_locales = parse_csv_val (include_arg ) or cli .default_target_locales
5151exclude_langs = set (parse_csv_val (exclude_arg ))
5252target_locales = [lang for lang in target_locales if lang not in exclude_langs ]
@@ -65,42 +65,42 @@ def overwrite_print(msg) : stdout.write('\r' + msg.ljust(terminal_width)[:termin
6565print ('' )
6666
6767# Prompt user for keys to ignore
68- ignore_keys = parse_csv_val (args .ignore_keys or cli .config_data .get ('ignore_keys' , '' ))
68+ ignore_keys = parse_csv_val (cli . args .ignore_keys or cli .config_data .get ('ignore_keys' , '' ))
6969while True :
7070 if ignore_keys : print ('Ignored key(s):' , ignore_keys )
7171 key = input ('Enter key to ignore (or ENTER if done): ' )
7272 if not key : break
7373 ignore_keys .append (key )
7474
7575# Determine closest locales dir
76- print_trunc (f'\n Searching for { locales_dir } ...' )
76+ print_trunc (f'\n Searching for { cli . locales_dir } ...' )
7777script_dir = os .path .abspath (os .path .dirname (__file__ ))
7878for root , dirs , files in os .walk (script_dir ): # search script dir recursively
79- if locales_dir in dirs :
80- locales_dir = os .path .join (root , locales_dir ) ; break
79+ if cli . locales_dir in dirs :
80+ cli . locales_dir = os .path .join (root , cli . locales_dir ) ; break
8181else : # search script parent dirs recursively
8282 parent_dir = os .path .dirname (script_dir )
8383 while parent_dir and parent_dir != script_dir :
8484 for root , dirs , files in os .walk (parent_dir ):
85- if locales_dir in dirs :
86- locales_dir = os .path .join (root , locales_dir ) ; break
87- if locales_dir : break
85+ if cli . locales_dir in dirs :
86+ cli . locales_dir = os .path .join (root , cli . locales_dir ) ; break
87+ if cli . locales_dir : break
8888 parent_dir = os .path .dirname (parent_dir )
89- else : locales_dir = None
89+ else : cli . locales_dir = None
9090
9191# Print result
92- if locales_dir : print_trunc (f'_locales directory found!\n \n >> { locales_dir } \n ' )
93- else : print_trunc (f'Unable to locate a { locales_dir } directory.' ) ; exit ()
92+ if cli . locales_dir : print_trunc (f'_locales directory found!\n \n >> { cli . locales_dir } \n ' )
93+ else : print_trunc (f'Unable to locate a { cli . locales_dir } directory.' ) ; exit ()
9494
9595# Load en/messages.json
9696msgs_filename = 'messages.json'
97- en_msgs_path = os .path .join (locales_dir , 'en' , msgs_filename )
97+ en_msgs_path = os .path .join (cli . locales_dir , 'en' , msgs_filename )
9898with open (en_msgs_path , 'r' , encoding = 'utf-8' ) as en_file :
9999 en_messages = json .load (en_file )
100100
101101# Combine [target_locales] w/ languages discovered in _locales
102102output_langs = list (set (target_locales )) # remove duplicates
103- for root , dirs , files in os .walk (locales_dir ):
103+ for root , dirs , files in os .walk (cli . locales_dir ):
104104 for folder in dirs :
105105 folder_path = os .path .join (root , folder )
106106 msgs_path = os .path .join (folder_path , msgs_filename )
@@ -123,7 +123,7 @@ def overwrite_print(msg) : stdout.write('\r' + msg.ljust(terminal_width)[:termin
123123 langs_skipped .append (lang_code ) ; langs_not_translated .append (lang_code ) ; continue
124124
125125 # Initialize target locale folder
126- folder_path = os .path .join (locales_dir , folder )
126+ folder_path = os .path .join (cli . locales_dir , folder )
127127 if not os .path .exists (folder_path ): # if missing, create folder
128128 os .makedirs (folder_path ) ; langs_added .append (lang_code ) ; lang_added = True
129129
@@ -146,7 +146,7 @@ def overwrite_print(msg) : stdout.write('\r' + msg.ljust(terminal_width)[:termin
146146 if key not in messages :
147147 original_msg = translated_msg = en_messages [key ]['message' ]
148148 try :
149- translator = Translator (provider = provider , to_lang = lang_code )
149+ translator = Translator (provider = cli . provider , to_lang = lang_code )
150150 translated_msg = translator .translate (original_msg ).replace ('"' , "'" ).replace (''' , "'" )
151151 if any (flag in translated_msg for flag in fail_flags ):
152152 translated_msg = original_msg
0 commit comments