* chore: Add GA for translation syntax validation * chore: Documentation link checker Co-authored-by: Gavin D'souza <gavin18d@gmail.com> * fix: URL Co-authored-by: Nabin Hait <nabinhait@gmail.com> Co-authored-by: Gavin D'souza <gavin18d@gmail.com> Co-authored-by: Nabin Hait <nabinhait@gmail.com>
		
			
				
	
	
		
			61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import re
 | |
| import sys
 | |
| 
 | |
| errors_encounter = 0
 | |
| pattern = re.compile(r"_\(([\"']{,3})(?P<message>((?!\1).)*)\1(\s*,\s*context\s*=\s*([\"'])(?P<py_context>((?!\5).)*)\5)*(\s*,\s*(.)*?\s*(,\s*([\"'])(?P<js_context>((?!\11).)*)\11)*)*\)")
 | |
| words_pattern = re.compile(r"_{1,2}\([\"'`]{1,3}.*?[a-zA-Z]")
 | |
| start_pattern = re.compile(r"_{1,2}\([f\"'`]{1,3}")
 | |
| f_string_pattern = re.compile(r"_\(f[\"']")
 | |
| starts_with_f_pattern = re.compile(r"_\(f")
 | |
| 
 | |
| # skip first argument
 | |
| files = sys.argv[1:]
 | |
| files_to_scan = [_file for _file in files if _file.endswith(('.py', '.js'))]
 | |
| 
 | |
| for _file in files_to_scan:
 | |
| 	with open(_file, 'r') as f:
 | |
| 		print(f'Checking: {_file}')
 | |
| 		file_lines = f.readlines()
 | |
| 		for line_number, line in enumerate(file_lines, 1):
 | |
| 			if 'frappe-lint: disable-translate' in line:
 | |
| 				continue
 | |
| 
 | |
| 			start_matches = start_pattern.search(line)
 | |
| 			if start_matches:
 | |
| 				starts_with_f = starts_with_f_pattern.search(line)
 | |
| 
 | |
| 				if starts_with_f:
 | |
| 					has_f_string = f_string_pattern.search(line)
 | |
| 					if has_f_string:
 | |
| 						errors_encounter += 1
 | |
| 						print(f'\nF-strings are not supported for translations at line number {line_number + 1}\n{line.strip()[:100]}')
 | |
| 						continue
 | |
| 					else:
 | |
| 						continue
 | |
| 
 | |
| 				match = pattern.search(line)
 | |
| 				error_found = False
 | |
| 
 | |
| 				if not match and line.endswith(',\n'):
 | |
| 					# concat remaining text to validate multiline pattern
 | |
| 					line = "".join(file_lines[line_number - 1:])
 | |
| 					line = line[start_matches.start() + 1:]
 | |
| 					match = pattern.match(line)
 | |
| 
 | |
| 				if not match:
 | |
| 					error_found = True
 | |
| 					print(f'\nTranslation syntax error at line number {line_number + 1}\n{line.strip()[:100]}')
 | |
| 
 | |
| 				if not error_found and not words_pattern.search(line):
 | |
| 					error_found = True
 | |
| 					print(f'\nTranslation is useless because it has no words at line number {line_number + 1}\n{line.strip()[:100]}')
 | |
| 
 | |
| 				if error_found:
 | |
| 					errors_encounter += 1
 | |
| 
 | |
| if errors_encounter > 0:
 | |
| 	print('\nVisit "https://frappeframework.com/docs/user/en/translations" to learn about valid translation strings.')
 | |
| 	sys.exit(1)
 | |
| else:
 | |
| 	print('\nGood To Go!')
 |