|
- 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*?.*?\n*?)*(,\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}\n{line.strip()[:100]}')
- continue
- else:
- continue
-
- match = pattern.search(line)
- error_found = False
-
- if not match and line.endswith((',\n', '[\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}\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}\n{line.strip()[:100]}')
-
- if error_found:
- errors_encounter += 1
-
- if errors_encounter > 0:
- print('\nVisit "https://influxerp.com/docs/user/en/translations" to learn about valid translation strings.')
- sys.exit(1)
- else:
- print('\nGood To Go!')
|